关于Delphi的消息循环及回调函数(100分)

  • 主题发起人 主题发起人 ysq
  • 开始时间 开始时间
Y

ysq

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi在Application中处理主消息循环,Application本身和任何一个TWinControl控件都向系统注册了一个回调函数(不知我理解对不对),主消息循环如何知道应把消息分发给哪一个回调函数处理呢。
 
Application.Run 中处理消息循环
应该是生成了一小段回调函数的汇编代码,以调用 TWinControl.MainWndProc
 
http://www.pconline.com.cn/pcedu/empolder/gj/delphi/0402/319419.html
 
说详细一点吧:
TWinControl 包装了 CreateWindowEx API,以创建一个窗口;
窗口的回调函数是程序在运行时通过 MakeObjectInstance 生成的汇编代码;
这段汇编代码调用 SomeWinControl.MainWndProc 处理窗口消息;

主消息循环通过 DispatchMessage 把消息发到相应窗口的回调函数。
 
Application本身的消息循环起什么作用呢
 
以下是剪切后的 ProcessMessage 方法,被 Run 方法调用以处理消息循环:

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
begin
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

TranslateMessage(Msg) 处理键盘消息的本地转换工作
DispatchMessage(Msg) 把消息发送到 Msg.HWND 窗口的回调函数中

Application 的消息循环就是把 Windows 系统发给应用程序的消息 Dispatch 到
应用程序的窗口回调函数中。
 
李維的《INSIDE VCL》裡有詳細的說明,
看暈掉。
 
谢谢savetime
 
后退
顶部