Аналог GetDC в Linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аналог GetDC в Linux

Сообщение Brainenjii » 18.07.2008 21:03:00

Есть ли? В винде было довольно просто рисовать на экране -
Var
  DC: HDC;
  Canva: TCanvas;
Begin
  DC := GetDC(0);
  Canva := TCanvas.Create(nil);
  Canva.Handle := dc;
и дальше собственно рисовать ^_^ А как сделать подобное в linux'e? ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Аналог GetDC в Linux

Сообщение B4rr4cuda » 18.07.2008 21:17:54

Полноценный пример не приведу, но в нужном направлении пну :).
Сравнительно недавно экспериментировал с X11 вот примерчик:
Код: Выделить всё
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.

Также стоит взглянуть на эту книжку.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Аналог GetDC в Linux

Сообщение Brainenjii » 18.07.2008 21:25:04

0.o

Добавлено спустя 1 минуту 52 секунды:
В смысле, я не совсем правильно выразился ^_^ Имелся в виду какой-нибудь простенький кроссплафторменный вариант ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Аналог GetDC в Linux

Сообщение FedeX » 21.07.2008 17:18:11

B4rr4cuda в правильную сторону толкает, скорее всего без вызова X-овых API не получится... Зная хендл Х-окна, можно получить хендл корневого окна (десктопа) - это и есть аналог GetDC(0). А там дальше уже по нему рисовать думаю не сложно будет...

У меня промежуточный вопрос: как можно имея LCL форму получить хендл Х-окна (или хотяб GTK-виджет)? Ведь хендл виндового окна проще простого - он в Form.Handle лежит, значит и к Х-овому окну должен быть доступ где-то. :?:
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Аналог GetDC в Linux

Сообщение B4rr4cuda » 22.07.2008 08:49:34

FedeX писал(а):У меня промежуточный вопрос: как можно имея LCL форму получить хендл Х-окна (или хотяб GTK-виджет)?


Вот шмат кода из wlxMplayer.lpr - листер плагина для Doublecmd.
Код: Выделить всё
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}
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Аналог GetDC в Linux

Сообщение FedeX » 23.07.2008 12:09:17

Спасибо, это то что надо!
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 49

Рейтинг@Mail.ru