Есть ли? В винде было довольно просто рисовать на экране -
Var
DC: HDC;
Canva: TCanvas;
Begin
DC := GetDC(0);
Canva := TCanvas.Create(nil);
Canva.Handle := dc;
и дальше собственно рисовать ^_^ А как сделать подобное в linux'e? ^_^
Модератор: Модераторы
Uses x,xlib,xutil,strings;
Const
WND_X = 0;
WND_Y = 0;
WND_WDT = 100;
WND_HGH = 100;
WND_MIN_WDT = 50;
WND_MIN_HGH = 50;
WND_BORDER_WDT = 5;
WND_TITLE = 'Hello!';
WND_ICON_TITLE = 'Hello!';
PRG_CLASS = 'Hello!';
(*
* SetWindowManagerHints - процедура передает информацию о
* свойствах программы менеджеру окон.
*)
Procedure SetWindowManagerHints (
prDisplay : PDisplay;
(*Указатель на структуру TDisplay *)
psPrgClass : PChar; (*Класс программы *)
argv : PPChar; (*Аргументы программы *)
argc : integer; (*Число аргументов *)
nWnd : TWindow; (*Идентификатор окна *)
x, (*Координаты левого верхнего *)
y, (*угла окна *)
nWidth,
nHeight, (*Ширина и высота окна *)
nMinWidth,
nMinHeight:integer;
(*Минимальные ширина и высота окна *)
psTitle : PChar; (*Заголовок окна *)
psIconTitle : PChar;
(*Заголовок пиктограммы окна *)
nIconPixmap : TPixmap (*Рисунок пиктограммы *)
);
Var
rSizeHints : TXSizeHints ;
(*Рекомендации о размерах окна*)
rWMHints : TXWMHints ;
rClassHint : TXClassHint ;
prWindowName, prIconName : TXTextProperty ;
Begin
If ( XStringListToTextProperty (@psTitle, 1, @prWindowName )=0) Or
(XStringListToTextProperty (@psIconTitle, 1, @prIconName )=0 ) Then
Begin
writeln('No memory!');
halt(1);
End;
rSizeHints.flags := PPosition Or PSize Or PMinSize;
rSizeHints.min_width := nMinWidth;
rSizeHints.min_height := nMinHeight;
rWMHints.flags := StateHint Or IconPixmapHint Or InputHint;
rWMHints.initial_state := NormalState;
rWMHints.input := True;
rWMHints.icon_pixmap := nIconPixmap;
rClassHint.res_name := argv[0];
rClassHint.res_class := psPrgClass;
XSetWMProperties ( prDisplay, nWnd, @prWindowName,
@prIconName, argv, argc, @rSizeHints, @rWMHints,
@rClassHint );
End;
(*
*main - основная процедура программы
*)
//void main(int argc, char *argv[])
Var
prDisplay: PDisplay;
(* Указатель на структуру Display *)
nScreenNum: integer;
(* Номер экрана *)
prGC: TGC;
rEvent: TXEvent;
nWnd: TWindow;
Begin
(* Устанавливаем связь с сервером *)
prDisplay := XOpenDisplay ( Nil );
If prDisplay = Nil Then
Begin
writeln('Can not connect to the X server!');
halt ( 1 );
End;
(* Получаем номер основного экрана *)
nScreenNum := XDefaultScreen ( prDisplay );
(* Создаем окно *)
nWnd := XCreateSimpleWindow ( prDisplay,
XRootWindow ( prDisplay, nScreenNum ),
WND_X, WND_Y, WND_WDT, WND_HGH, WND_BORDER_WDT,
XBlackPixel ( prDisplay, nScreenNum ),
XWhitePixel ( prDisplay, nScreenNum ) );
(* Задаем рекомендации для менеджера окон *)
SetWindowManagerHints ( prDisplay, PRG_CLASS, argv, argc,
nWnd, WND_X, WND_Y, WND_WDT, WND_HGH, WND_MIN_WDT,
WND_MIN_HGH, WND_TITLE, WND_ICON_TITLE, 0 );
(* Выбираем события, обрабатываемые программой *)
XSelectInput ( prDisplay, nWnd, ExposureMask Or KeyPressMask );
(* Показываем окно *)
XMapWindow ( prDisplay, nWnd );
(* Цикл получения и обработки событий *)
While ( true ) Do
Begin
XNextEvent ( prDisplay, @rEvent );
Case ( rEvent.eventtype ) Of
Expose :
Begin
(* Запрос на перерисовку *)
If ( rEvent.xexpose.count <> 0 ) Then
continue;
prGC := XCreateGC ( prDisplay, nWnd, 0 , Nil );
XSetForeground ( prDisplay, prGC,
XBlackPixel ( prDisplay, 0) );
XDrawString ( prDisplay, nWnd, prGC, 10, 50,
'Hello, world!', strlen ( 'Hello, world!' ) );
XFreeGC ( prDisplay, prGC );
End;
KeyPress :
Begin
(* Нажатие клавиши клавиатуры *)
XCloseDisplay ( prDisplay );
halt ( 0 );
End;
End;
End;
End.
FedeX писал(а):У меня промежуточный вопрос: как можно имея LCL форму получить хендл Х-окна (или хотяб GTK-виджет)?
procedure TMPlayer.SetParentWidget(AWidget: THandle);
{$IFDEF LCLQT}
begin
//xid -id иксового окна
//QWidgetH(AWidget) - QT-Виджет соответствующий хэндлу AWidget
xid:= QWidget_winId(QWidgetH(AWidget));
hWidget:= AWidget;
end;
{$ELSE}
var
widget,
mySocket:PGtkWidget; //the socket
begin
widget := gtk_vbox_new(FALSE,0);
mySocket := gtk_socket_new();
gtk_container_add (GTK_CONTAINER(widget), mySocket);
gtk_widget_show(mySocket);
gtk_widget_show(widget);
//*****
//PGtkWidget(Awidget) - GTK-Виджет соответствующий хэндлу AWidget
gtk_container_add (GTK_CONTAINER (PGtkWidget(Awidget)), widget);
gtk_widget_realize(mySocket);
gtk_widget_hide(PGtkWidget(AWidget));
{$IFDEF LCLGTK}
xid:=(PGdkWindowPrivate(widget^.window))^.xwindow;
{$ENDIF}
{$IFDEF LCLGTK2}
xid:=GDK_WINDOW_XID(widget^.window);
{$ENDIF}
hWidget:= THandle(widget);
end;
{$ENDIF}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47