Y ysq Unregistered / Unconfirmed GUEST, unregistred user! 2004-03-05 #1 Delphi在Application中处理主消息循环,Application本身和任何一个TWinControl控件都向系统注册了一个回调函数(不知我理解对不对),主消息循环如何知道应把消息分发给哪一个回调函数处理呢。
Delphi在Application中处理主消息循环,Application本身和任何一个TWinControl控件都向系统注册了一个回调函数(不知我理解对不对),主消息循环如何知道应把消息分发给哪一个回调函数处理呢。
S savetime Unregistered / Unconfirmed GUEST, unregistred user! 2004-03-05 #2 Application.Run 中处理消息循环 应该是生成了一小段回调函数的汇编代码,以调用 TWinControl.MainWndProc
D dana Unregistered / Unconfirmed GUEST, unregistred user! 2004-03-05 #3 http://www.pconline.com.cn/pcedu/empolder/gj/delphi/0402/319419.html
S savetime Unregistered / Unconfirmed GUEST, unregistred user! 2004-03-05 #4 说详细一点吧: TWinControl 包装了 CreateWindowEx API,以创建一个窗口; 窗口的回调函数是程序在运行时通过 MakeObjectInstance 生成的汇编代码; 这段汇编代码调用 SomeWinControl.MainWndProc 处理窗口消息; 主消息循环通过 DispatchMessage 把消息发到相应窗口的回调函数。
说详细一点吧: TWinControl 包装了 CreateWindowEx API,以创建一个窗口; 窗口的回调函数是程序在运行时通过 MakeObjectInstance 生成的汇编代码; 这段汇编代码调用 SomeWinControl.MainWndProc 处理窗口消息; 主消息循环通过 DispatchMessage 把消息发到相应窗口的回调函数。
S savetime Unregistered / Unconfirmed GUEST, unregistred user! 2004-03-05 #6 以下是剪切后的 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 到 应用程序的窗口回调函数中。
以下是剪切后的 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 到 应用程序的窗口回调函数中。
L lichdr Unregistered / Unconfirmed GUEST, unregistred user! 2004-03-05 #7 李維的《INSIDE VCL》裡有詳細的說明, 看暈掉。