您的位置:首页 > 编程语言 > Delphi

初涉Delphi下Windows消息机制——同一程序内自定义消息实例

2010-02-05 09:24 441 查看
消息区别于调用的优势:消息可以让你不需要知道接收者的确切类型。同时,消息可以有选择地处理。如果接收者对消息没有做任何处理,不会造成任何后果。最后,消息可以广播给多个接收者,而要同时调用几个过程则比较困难。

下面是一个在同一应用程序内自定义消息的实例:

创建一个窗口FORM1,拖一个按钮控件,btn1。双击btn1,创建btn1的点击事件。代码如下(省略头部代码):

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
//自定义消息常量
const
MY_MESSAGE=WM_USER+100;
type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
//消息处理函数
procedure mymessage(var mymsg:TMessage);message MY_MESSAGE;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
//消息处理
procedure Tform1.mymessage(var mymsg:TMessage);
begin
beep;
inherited;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
//发送消息
SendMessage(Form1.Handle,MY_MESSAGE,0,0);
end;
end.


运行该程序,点击button,就会运行SendMessage发送MY_MESSAGE这样一个自定义消息过去。Mymessage接受到该消息就会产生beep声响。

向指定窗口句柄发送消息的函数有3个,也就是sendMessage可以用其他两个代替:

Form1.perform(MY_MESSAGE,0,0);

PostMessage(Form1.Handle,MY_MESSAGE,0,0);

Perform和SendMessage是要等消息处理结束后才返回,而PostMessage则是把消息送到消息队列之后,立即返回,管你什么时候处理。

在这个程序中。我们定义消息常量MY_MESSAGE=WM_USER+100;因为系统约定WM_USER+100到$7FFF之间是留给用户自定义的消息常量值。

procedure mymessage(var mymsg:TMessage);message MY_MESSAGE;

这次传递的是TMessage类型。而message标识符后面则是自定义消息常量。

SendMessage(Form1.Handle,MY_MESSAGE,0,0);

这是发送消息函数,参数类型分别为HWND,UINT,WPARAM,LPARAM,分别对应TMsg前4个成员。返回值为LRESULT,对应消息处理结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: