深入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方法。

posted @ 2020-01-21 00:34  delphi学习园地  阅读(258)  评论(0编辑  收藏  举报