Accessing the Interfaces directly/pt

From Lazarus wiki
Revision as of 20:13, 3 February 2012 by Chronos (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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: Um objeto TQtBrush de qtprivate.pas
  • Carbon: Um objeto TCarbonBrush de carbongdiobjects.pp

TBitmap

  • Win32, WinCE: HBITMAP
  • Gtk: PGDIObject (definido na unidade GtkDef)
  • Qt: Um objeto TQtImage de qtobjects.pas unit
  • Carbon: Um objeto TCarbonBitmap de carbongdiobjects.pp

Você pode acessar isto no Gtk fazendo:

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, um handle de janela nativo
  • Gtk: É um ponteiro para uma estrutura.
  • Qt: O handle é um ponteiro para um objeto da classe TQtMainWindow declarada em qtwidgets.pas. Para ter acess ao objeto do Qt TQtMainWindow significa faça:

TQtMainWindow(Handle).Widget

  • Carbon: TCarbonWindow de carbonprivate.pp

TMenu, TMainMenu, TMenuItem and TPopUpMenu

  • Win32, WinCE : HMENU
  • Qt: TMainMenu é um ponteiro para um objeto TQtMenuBar. TPopUpMenu é um objeto TQtMenu. TMenuItem pode ser um TQtAction se representa um item selecionável, ou um separador ou um TQtMenu se é um item que tem submenus.
  • Carbon: TMenuItem é um objeto TCarbonMenu, TMenu (TMainMenu e TPopupMenu) é representado pelo seu item de menu raiz.