Sign in Join
Wiki copytemporary

Revision 1 of 3, by Chronos on 2-3-2012. The page as it is now.

Accessing the Interfaces directly/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:

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:

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

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

Carbon

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

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

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

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

TCanvas

TBrush

TBitmap

Você pode acessar isto no Gtk fazendo:

pascal
var
  GDIObject: PGDIObject;
  Bitmap: TBitmap;
  AImage: PGtkWidget;
begin
  ...
pascal
GDIObject := PgdiObject(Bitmap.Handle);
pascal
AImage := gtk_image_new_from_pixmap(GDIObject^.GDIPixmapObject,
 GDIObject^.GDIBitmapMaskObject);
pascal
gtk_widget_show(AImage);
pascal
gtk_container_add(GTK_CONTAINER(MyForm.Handle), AImage);
pascal
end;

TCustomForm

TQtMainWindow(Handle).Widget

TMenu, TMainMenu, TMenuItem and TPopUpMenu


From the Free Pascal wiki, page "Accessing the Interfaces directly/pt", as it stood on 2012-02-03 after a change by Chronos, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.