Генерация скриншотов в Kylix-приложении
Низкоуровневый графический вывод
Функция FindWindow для X-Windows
Как не показывать баннер в приложениях, созданных в Kyilx OE?
Как сделать полноэкранное приложение с помощью Borland Kylix ?
После этого программы, созданные в Kylix 3, можно запускать отдельно от Kylix.
Решение для Kylix 1
Решений может быть несколько, самое простое выглядит так:
Скопируйте из каталога kylix/bin/ библиотеки libqt и libqtintf в отдельный каталог, например /home/user/libdir/. Создайте файл скрипта (назовите его, например, kapprun) со следующим текстом:
#!/bin/bash
LD_LIBRARY_PATH="/home/user/libdir:$LD_LIBRARY_PATH"
$1
Не забудьте присвоить файлу статус исполнимого:
chmod +x kapprun
Теперь приложения, скомпилированные в Kylix, можно запускать так:
./kapprun ./Project1
Строка ./Project1 передается в качестве аргумента скрипту kapprun.
Вам придется распространиять свои приложения вместе с библиотеками libqt и libqtintf и скриптом, подобным предложенному выше.
Решение для Kylix 2
Если вы хотите распространять графическое приложение отдельно от IDE, вам придется распространять вместе с ним библиотеки libqt.so.2.3.0 и libqtintf-6.5.0-qt2.3.so. Механизм следующий: создаете в каталоге пользователя вашей программы специальный каталог, например kylibs, и копируете туда вышеуказанные библиотеки. Затем в каталоге kylibs командуете:
ln -sf libqtintf-6.5.0-qt2.3.so libqtintf-6.5-qt2.3.so ln -sf libqt.so.2.3.0 libqt.so.2
Теперь создайте файл k2apprun следующего содержания:
#!/bin/bash export LD_LIBRARY_PATH=/home/user/kylibs:$LD_LIBRARY_PATH $*
и присвойте ему статус исполнимого. Приложения запускаются командой:
./k2apprun App
где App - путь к приложению.
Автор: Андрей Боровский
procedure GrabControl(Control : TWidgetControl; const FileName, Format : String); var PM : QPixmapH; FN : WideString; begin PM := QPixmap_create; QPixmap_grabWidget(PM, Control.Handle, 0, 0, -1, -1); FN := FileName; QPixmap_save(PM, @FN, PChar(Format)); QPixmap_destroy(PM); end; |
Первый параметр процедуры - визуальный элемент управ ления скриншот которого нужно получить, потомок класса TWidgetControl. Второй параметр - имя файла, в котором сохраняется изображение. Третий параметр - формат изображения. Следует указывать один из форматов, поддерживаемых Qt-library: PNG, XPM, BMP и т. д.
Если функции GrabControl передать указатель на форму, на полученном скриншоте будет отображена только клиентская часть формы (со всеми дочерними компонентами). Для получения скриншота окна целиком, с заголовком и обрамлением, следует использовать функцию GrabForm:
procedure GrabForm(Form : TCustomForm; const FileName, Format : String);
var
PM : QPixmapH;
FN : WideString;
Root, Parent, Wnd : TWindow;
Children: PWindow;
NChildren : Integer;
begin
if not Form.Visible then Exit;
PM := QPixmap_create;
Wnd := QWidget_winID(Form.Handle);
XQueryTree(QtDisplay, Wnd, @Root, @Parent, @Children, @NChildren);
XFree(Children);
while Parent <> Root do
begin
Wnd := Parent;
XQueryTree(QtDisplay, Wnd, @Root, @Parent, @Children, @NChildren);
XFree(Children);
end;
QPixmap_grabWindow(PM, Wnd, 0, 0, -1, -1);
FN := FileName;
QPixmap_save(PM, @FN, PChar(Format));
QPixmap_destroy(PM);
end; |
Автор: Андрей Боровский
Низкоуровневый графический вывод
Для того, чтобы выполнить графический вывод в окно визуального компонента Kylix средствами X-Windows API, необходимо получить идентификатор окна и связать его с дисплеем. Идентификатор окна для некоторого Kylix компонента Component можно получить при помощи следующей функции из модуля Qt:
WinID := QWidget_winId( QWidgetH(Component.Handle) );
Идентификатор дисплея содержится в переменной QtDisplay, определенной в модуле Qt.
Теперь у нас есть идентификаторы окна и дисплея, которые можно передавать функциям X-Windows API.
Автор: Андрей Боровский
{ Функция FindWindow
© 2001 Андрей Боровский
Public Domain. }
function FindWindow(Display : PDisplay;
Root : TWindow; const Name : String) : TWindow;
const StackDepth = 32;
type
TWinArray = array[0..0] of TWindow;
PWinArray = ^TWinArray;
StackElem = record
Children : PWinArray;
NChildren, Position : Integer;
end;
var
Stack : array[0..StackDepth-1] of StackElem;
StackPtr, i : Integer;
retName : PChar;
Wnd : TWindow;
begin
// Проверяем корневое окно
XFetchName(Display, Root, @retName);
if Name = retName then
begin
// Корневое окно подходит
XFree(retName);
Result := Root;
Exit;
end;
Result := 0;
StackPtr := 0;
Stack[StackPtr].Position := 0;
XQueryTree(Display, Root, @Wnd, @Wnd,
@(Stack[StackPtr].Children), @(Stack[StackPtr].NChildren));
while Result = 0 do
if Stack[StackPtr].Position < Stack[StackPtr].NChildren then
begin
Wnd := Stack[StackPtr].Children^[Stack[StackPtr].Position];
XFetchName(Display, Wnd, @retName);
if Name = retName then
begin
// Окно найдено
Result := Wnd;
XFree(retName);
for i := 0 to StackPtr do XFree(Stack[i].Children);
end else
begin
XFree(retName);
if StackPtr < StackDepth - 1 then
begin
Inc(StackPtr);
XQueryTree(Display, Wnd, @Wnd, @Wnd,
@(Stack[StackPtr].Children), @(Stack[StackPtr].NChildren));
Stack[StackPtr].Position := 0;
end else Inc(Stack[StackPtr].Position);
end;
end else
begin
XFree(Stack[StackPtr].Children);
Dec(StackPtr);
if StackPtr = -1 then Exit; // Окно не найдено
Inc(Stack[StackPtr].Position);
end;
end;
|
Функция позволяет получить идентификатор окна по его названию. В параметре Display передается указатель на X-дисплей, параметр Root должен содержать идентификатор окна, с которого следует начать поиск (обычно это корневое окно дисплея). В параметре Name передается имя окна, идентификатор которого требуется получить. Константа StackDepth ограничивает максимальную "глубину погружения" при обходе дерева окон.
Для того, чтобы получить идентификатор окна с именем SomeWndName, вызваем FindWindow следующим образом:
WinID := FindWindow(QtDisplay, QWidget_winID(Application.Desktop), 'SomeWndName');
Автор: Андрей Боровский
Как не показывать баннер в приложениях, созданных в Kyilx OE?
Приложения, созданные в Kylix OE, выводят при запуске небольшое окошко, в котором предупреждают о том, что "данное приложение создано в некоммерческой версии Kylix ...". Для того, чтобы приложение при запуске не показывало это окно, его необходимо запускать с ключом -ns.Автор: Андрей Боровский
Иногда необходимо, чтобы клиентская область формы Kylix-приложения занимала все пространство экрана. Это может понадобиться например в играх и приложениях multimedia. Перевести форму приложения в полноэкранный режим можно с помощью вызова:
QWidget_showFullScreen(Form.Handle);
а вернуть в нормальный режим - с помощью вызова
QWidget_showNormal(Form.Handle);
Следует помнить, что в полноэкранном режиме переключение на другие приложения (с помощью [Alt]-[Tab]) заблокировано.
Автор: Андрей Боровский