深入delphi编程理解之消息(五)重写(override)dispatch、wndproc方法和Application.OnMessage事件
dispatch、wndproc是VCL framework在TWinCtronl定义的虚拟方法,下面程序通过重写(override)这两函数拦截WM_LBUTTONDOWN消息,来与Application.OnMessage事件比较,测试消息流程的先后顺序。
一、程序代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure WndProc(var AMessage: TMessage); override;
procedure dispatch(var AMessage); override;
procedure FonMessage(var AMessage: TMsg;var Handled: Boolean);
procedure AppMsg(Info: string);
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.AppMsg(Info: string);
begin
ListBox1.Items.Add(Info);
ListBox1.Items.Add('-------------');
ListBox1.Perform(WM_VSCROLL,SB_BOTTOM,0);
end;
procedure Tform1.WndProc(var AMessage: TMessage);
begin
inherited;
if AMessage.Msg = WM_LBUTTONDOWN then
AppMsg('WndProc½Óµ½ÁËÐÅÏ¢');
end;
procedure Tform1.dispatch(var AMessage);
begin
inherited;
if Tmessage(AMessage).Msg = WM_LBUTTONDOWN then
AppMsg('dispatch½Óµ½ÁËÐÅÏ¢');
end;
procedure Tform1.FonMessage(var AMessage: TMsg;var Handled: Boolean);
begin
if Amessage.message = WM_LBUTTONDOWN then
AppMsg('AppOnMessage½Óµ½ÐÅÏ¢');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(Handle, WM_LBUTTONDOWN, 0, 0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
PostMessage(Handle, WM_LBUTTONDOWN, 0, 0);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Self.Perform(WM_LBUTTONDOWN, 0, 0);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=FonMessage;
end;
end.
二、程序界面
从程序运行结果来看,Application.OnMessage先拦截到消息,然后是dispatch,最后才是wndproc方法。