现在的位置: 首页 > 综合 > 正文

Delphi Windows 消息 1

2018年05月27日 ⁄ 综合 ⁄ 共 2125字 ⁄ 字号 评论关闭

1.什么是消息
在Windows单元中,消息是这样声明的:
type
TMsg=packed record
    hwnd:HWND;//窗口句柄
    message:UNIT;//消息常量标识符
    wParam:WPARAM;//32位消息的特定附加消息
    lParam:LPARAM;
    time:DWORD;//消息创建的时间
    pt:TPoint;//消息创建时鼠标位置
end;
消息就是Windows就某个事情发生了而给出的一个通知。这个通知是一个记录类型,包含了消息类型以及其它信息。

2.常见消息,如
WM_ACTIVATE       $0006       窗体被激活或者取消激活
WM_CHAR           $0102       按下某键    
WM_TIMER          $0113       发生定时事件
WM_QUIT           $0012       程序将要退出

3.Windows消息系统
消息队列。Windows能够为所有的应用程序维护一个消息队列。应用程序再从队列中取出消息,分派给某个窗口。
消息循环。通过这个循环机制应用程序从消息队列中检索消息,分派,如此依次。
窗口过程。每个窗口都有一个窗口过程来接受传递给窗口的消息,它的任务是获取信息后然后响应它。窗口过程是一个回调函数 ;处理了一个消息后,它通常返回一值给Windows/

4.Delphi中的消息处理
所谓消息处理,就是应用程序以某种方式响应Windows消息。在Delphi中,每个消息都有各自的过程,须满足3个条件:
这个过程必须是一个对象中的方法
这个过程必须有一个var参数,变量的类型TMessage或其它特殊消息记录。
声明这个过程时,必须使用message指示符,后面跟要处理的消息的常量值。

例如:
procedure WMPaint(var Msg:TWMPaint);message WM_PAINT;
这就是Delphi中消息处理的语法。

5.对Result域赋值
当处理某些Windows消息时,Windows希望返回一个值。
procedure TForm1.WMCtlColor(var Msg:TWMCtlColor);
var
BrushHand: hBrush;
begin
inherited;
{创建一个画刷的句柄,并放进BrushHand变量}
Msg.Result := BrushHand;
end;

6.发送消息
Perform      
function TControl.Perform(Msg:Cardinal;WParam,LParam:Longint):Longint;
VCL的Perform()方法适用于所有的TControl派生对象调用Perform后,它要等消息得到处理后才返回。

有的时候,可能需要向一个只知其句柄的窗口发送消息 ,可以通过下面2个API函数。
function SendMessage(hWnd:HWND; Msg:UINT; WParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
function PostMessage(hWnd:HWND; Msg:UINT; WParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
它们的区别是,SendMessage返回此消息被处理的结果值,而PostMessage返回一个布尔值,表示消息是否已被放到消息队列中。

7.自定义消息
有些情况下,一个应用程序可能需要向自己发送消息,或者在两个应用程序之间发送消息。你会有这样一个问题:“为什么要发送消息而不是直接调用一个过程”。这个问题问得好,有这样几个答案。首先,消息可以让你不需要知道接受者的确切类型。同时,消息可以有选择地处理。如果接收者对消息没有做任何处理,不会造成任何后果。最后,消息可以广播给多个接收者,而要同时调用几个过程则比较困难。
(1)在应用程序发送消息
const SX_MYMESSAGE= WM_USER + 100;

begin
    SomeForm.Perform(SX_MYMESSAGE,0,0);
    {或者}
    SendMessage(SomeForm.Handle,SX_MYMESSAGE,0,0);
    .
    .
    .
end;

然后声明一个普通的消息处理过程来处理SX_MYMESSAGE的消息。
TForm1=class(TForm)
    .
    .
    .
private
    procedure SXMyMessage(var Msg:TMessage);message SX_MYMESSAGE;
end;

处理用户自定义消息与处理标准Windows消息几乎没有什么不同,真正的关键在于,必须声明一个消息常量,它的值必须从WM_USER+100开始。最好为自定义的消息起一个表明它的用途的名字。

(2)在应用程序之间发送消息
如果在两个或者多个应用程序之间发送消息,那么最好调用RegisterWindowMessage()这个函数来确保每个应用程序使用一致的消息编号。

(3)广播消息
TWinControl的派生对象可以调用Broadcast()来向它的子控件广播一个消息

【上篇】
【下篇】

抱歉!评论已关闭.