Accessing the Interfaces directly/pt

From Free Pascal wiki
Jump to navigationJump to search

English (en) português (pt)

Esta página descreve como ter acesso direto de escrita ao widgeset subjacente usado pelo Lazarus (por exemplo: a API do Windows, ou GTK ou QT, etc). Pode-se sempre tentar evitar de confiar nas especifidades do widgeset. Este documento está aqui para as pessoas melhorarem o widgeset e para quem escreve componentes e realmente precisa acessar os widgeset diretamente.

Visão Geral

Cada TWinControl tem um handle e a LCL não precisa saber o que é um handle. O significado de um handle é totalmente assunto da interface:

  • em Gtk um handle é freqüentemente um PGtkWidget.
  • em Windows um handle é freqüentemente um HWnd.
  • em Carbon um handle é freqüentemente um objeto descendente de TCarbonWidget.
  • em Qt um handle é freqüentemente um ponteiro para um objeto descendente de TQtWidget.

Detalhes de cada Widgetset

Qt

Handles em Qt são na maioria ponteiros para objetos. Toda vez que um controle é criado, um objeto de ajuda é também criado e os dois são conectados. O objeto de ajuda é necessário para receber eventos do Qt. Depois de receber um evento, ele vai enviá-lo para a LCL.

A maior parte dos objetos é descendente de TQtWidget, como declarado abaixo:

 { TQtWidget }

 TQtWidget = class(TObject)
 private
 public
   Widget: QWidgetH;
   LCLObject: TWinControl;
 end;

Note as duas variáveis que todos eles contêm:

  • Widget - Esta é uma conexão ao objeto do Qt para este Widget
  • LCLObject - É uma ponte com o objeto da LCL a que ele está vinculado.

Carbon

Handles em Carbon são muito similares aos do Qt. As classes do helper são descendentes da classe abstrata TCarbonWidget.

 { TCarbonWidget }

 TCarbonWidget = class(TObject)
 private
 public
   Widget: Pointer;
   LCLObject: TWinControl;
 end;

Note as duas variáveis que todos eles contêm:

  • Widget - Esta é uma conexão com o objeto do Carbon para este Widget:ControlRef (descendentes de TCarbonControl) ou WindowRef (descendentes de TCarbonWindow).
  • LCLObject - É uma ponte com o objeto da LCL a que ele está vinculado.

Windows

Handles em Win32 ou WinCE são quase sempre o mesmo que os seus handles relativos da API. Por exemplo, um handle de TMenu é HMENU, um handle de TBrush é HBRUSH, portanto você pode facilmente usá-los e passá-los para as APIs.

List of Handles on various LCL classes

TFont

  • Win32, WinCE: HFONT
  • Qt: Um objeto TQtFont de qtprivate.pas
  • Carbon: Um objeto TCarbonFont de carbongdiobjects.pp

TCanvas

  • Win32, WinCE: HDC
  • Gtk: Um objeto TDeviceContext de gtkdef.pp
    • Você pode can pegar um drawable, por exemplo com: TDeviceContext(MyCanvas.Handle).Drawable
  • Qt: Um objeto TQtDeviceContext de qtprivate.pas
  • Carbon: Um objeto TCarbonDeviceContext de carboncanvas.pp
    • O handle nativo pode ser accessado com TCarbonDeviceContext(MyCanvas.Handle).CGContext de tipo CGContextRef

TBrush

  • Win32, WinCE: HBRUSH
  • Qt: A TQtBrush object from qtprivate.pas
  • Carbon: A TCarbonBrush object from carbongdiobjects.pp

TBitmap

  • Win32, WinCE: HBITMAP
  • Gtk: PGDIObject (defined on unit GtkDef)
  • Qt: A TQtImage object from qtobjects.pas unit
  • Carbon: A TCarbonBitmap object from carbongdiobjects.pp

You can access this on Gtk using:

var
  GDIObject: PGDIObject;
  Bitmap: TBitmap;
  AImage: PGtkWidget;
begin
  ...

  GDIObject := PgdiObject(Bitmap.Handle);

  AImage := gtk_image_new_from_pixmap(GDIObject^.GDIPixmapObject,
   GDIObject^.GDIBitmapMaskObject);

  gtk_widget_show(AImage);

  gtk_container_add(GTK_CONTAINER(MyForm.Handle), AImage);
end;

TCustomForm

  • Win32, WinCE: it´s a HWND, a native window handle
  • Gtk: It´s a pointer to a structure.
  • Qt: The Handle is a pointer to a object from the TQtMainWindow class declared at qtwidgets.pas. To have access to the QMainWindow Qt object it represents do: TQtMainWindow(Handle).Widget
  • Carbon: TCarbonWindow from carbonprivate.pp

TMenu, TMainMenu, TMenuItem and TPopUpMenu

  • Win32, WinCE : HMENU
  • Qt: TMainMenu is a pointer to a TQtMenuBar object. TPopUpMenu is a TQtMenu object. TMenuItem can either be a TQtAction if it represents a clickable item or a separator or a TQtMenu if it is an item that has submenus.
  • Carbon: TMenuItem is a TCarbonMenu object, TMenu (TMainMenu and TPopupMenu) is represented by its root menu item