关于VCL的编写 (二) 简单介绍一下VCL消息传递

简单介绍一下 VCL 消息传递

VCL 除了封装了 WINDOWS 消息外,还有自己自定义的一些消息。 WINDOWS 的消息以 WM_ 开头,可以参考 Delphi Help 里带的 WINDOWS SDK 或 MSDN, 在 Messages.pas 文件中也可以看得到 . VCL 的一些内部消息,一般是以 CM_ CN_ CB_ 等开头的,在 Controls.pas 文件中也可以看得到 , 具体的使用可以查看 Delphi 方面的资料。

下面,我就 VCL 的内部消息做一个简单介绍。

Delphi 中每一个 VCL 构件都有一内在的消息处理机制,基本原理就是构件类接收到某些消息并把它们发送给适当的处理方法 , 如果没有特定的处理方 法,则调用缺省的消息处理句柄。处理消息的几个方法有 :

mainwndproc 是定义在 Twincontrol 类中的一个静态方法, 不能被重载 (Override) 。 它不直接处理消息, 而是交由 wndproc 方法处理, 并为 wndproc 方法提供一个异常处理。 Mainwndproc 方 法 声 明 如 下 :

procedure MainWndProc(var Message: TMessage);

Wndproc 是在 Tcontrol 类中定义的一个虚拟方法 , 由它调用 dispatch 方法来进行消息的分配 , wndproc 方 法 声 明 如 下 :

procedure WndProc(var Message: TMessage); virtual;

dispatch 方法是在 Tobject 根类中定义的 , 其声明如下 :

procedure Tobject.dispatch(var Message);

传递给 dispatch 的消息参数必须是一个记录 类型 , 且这个记录中第一个入点必须是一个 cardinal 类型的域 (field), 它包含了要分配的消息的消息号码 , 如 Tmessage 类型 ( 具体定义参见 Delphi), 而 Dispatch 方法会根据消息号码调用构件的最后代类中处理此消息的句 柄方法 . 如果此构件和它的祖先类中都没有对应此消息的处理句柄 ,Dispatch 方法便会调 用 Defaulthandler 方法 .Defaulthandler 方法是定义于 Tobject 中的虚拟方法 , 其声明如下 :

procedure Defaulthandler(var Message);virtual;

Tobject 类中的 Defaulthandler 方法只是实现简单的返回而不对消息进行任何的处理 . 我们可以通过对此虚拟方法的重载 , 在子类中实现对消息的缺省处理 . 对于 VCL 中的构件 而言 , 其 Defaulthandler 方法会启动 windows API 函 数 Defwindowproc 对消息进行处理 .

以上篇的 TMyEdit 为例 .

TMyEdit=class(TEdit)

private

protected

//// 重写消息事件 消息的声明

procedure CMExit(var Message: TCMExit); message CM_EXIT; ?

public

endl

消息的声明如上 , 消息处理方法必须是一个过程 , 方法后面必须有一个 Message. 在后面加消息定义 , 不需要用 override 命令来显式指明重载 , 且一般声明在构件的 protected 或 private 区 .

当然你可以写自己的消息 , 一般从 WM_User 加一个常数作为你的消息 . 你可以通过 SendMessage 和 PostMessage 触发你的消息 . VCL 的所有事件都是通过消息来触发的 , 由此 , 你也可以增加自己构件事件 . 顺便说一下 SendMessage 和 PostMessage 的区别 : 前一个是有返回 , 后一个是不需要返回的 . 如果你对构件的某个改变是依赖于某个消息的所触发的处理完成的结果 , 你就必须用 SendMessage . SendMessage 的声明如下

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

第一个参数是构件句柄 , 第二就是消息常量 , 后面的是一些其他参数信息 , 鼠标 , 键盘等等 . 在这里我们不另外定义自定义消息了 , 就用 CM_EXIT 试举一例 :

SendMessage(MyEdit.hanle, CM_EXIT,0,0 ) ;

这样就可以触发 CMExit 也就是控件的焦点退出 OnExit 事件 .

关于 VCL 消息就说这麽多了 , 我自己也没有搞得太明白 , 不太说得清楚 . ? Windows API 就不说了 , 很多资料可以查 , MSDN 很全 , 我也只知道几个常用的 .

?

Published At
Categories with Web编程
Tagged with
comments powered by Disqus