Lazarus 下如何让非可视化组件(类)截获事件

二话不说直接上源码,很简单,哈哈
unit uMessageTest;

{$mode objfpc}{$H+}

interface

uses
  Windows, LMessages, Classes, SysUtils, FileUtil, Forms, Controls, Graphics,
  Dialogs, StdCtrls, ExtCtrls, InterfaceBase;

const
  WM_MYMESSAGE = WM_USER + 1;

type

  { TFrmMessageTest }

  TFrmMessageTest = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

  { TMyControls }

  TMyControls = class(TWinControl)
  protected
    procedure WndProc(var Message: TLMessage); override;
  public
    procedure SendMsg;
  end;

  { TNon_Controls }

  TNon_Controls = class(TObject)
  private
    procedure WndProc(var Message: TLMessage);
  public
    Hwd: HWND;
    procedure SendMsg;
    constructor Create;
    destructor Destroy; override;
  end;

var
  FrmMessageTest: TFrmMessageTest;

implementation

{ TNon_Controls }

procedure TNon_Controls.WndProc(var Message: TLMessage);
begin
  if Message.msg = WM_MYMESSAGE then
     ShowMessage('截获非可视自定义事件!')   ;
  Message.msg := 0;
end;

procedure TNon_Controls.SendMsg;
begin
  PostMessage(Hwd, WM_MYMESSAGE, 0, 0);
end;

constructor TNon_Controls.Create;
begin
  if Hwd = 0 then  //WidgetSet需引用InterfaceBase
     Hwd := WidgetSet.AllocateHWnd(@WndProc);
end;

destructor TNon_Controls.Destroy;
begin
  if Hwd <> 0 then begin
     WidgetSet.DeallocateHWnd(Hwd);
     Hwd := 0;
  end;
  inherited Destroy;
end;

{ TFrmMessageTest }

procedure TFrmMessageTest.Button1Click(Sender: TObject);
var
  mycon: TMyControls;
begin
  mycon := TMyControls.Create(Self);
  mycon.Parent := Self;
  mycon.Visible := False;
  mycon.SendMsg;
end;

procedure TFrmMessageTest.Button2Click(Sender: TObject);
var
  mycon: TNon_Controls;
begin
  mycon := TNon_Controls.Create;
  mycon.SendMsg;
end;

{$R *.lfm}

{ TMyControls }

procedure TMyControls.WndProc(var Message: TLMessage);
begin
  if Message.msg = WM_MYMESSAGE then
     ShowMessage('截获自定义事件!')
  else
     inherited WndProc(Message);
end;

procedure TMyControls.SendMsg;
begin
  PostMessage(Self.Handle, WM_MYMESSAGE, 0, 0);
end;

end.
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值