请问DispatchMessage(Msg);之后应该转到procedure TApplication.WndProc(var Message: TMessage);那么什么时候执行窗体的mainWndProc

zhuyif 2006-12-31 02:52:35
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
else
FTerminate := True; // 看到我们刚才提高的这个标志了吗
end;
end;




请问DispatchMessage(Msg);之后应该转到procedure TApplication.WndProc(var Message: TMessage);那么什么时候执行窗体的mainWndProc
...全文
209 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
linzhengqun 2006-12-31
  • 打赏
  • 举报
回复
你首先要明白为什么会有消息,那就是在Run里面,程序主动去消息队列中取消息。
所以在Run之前的消息都放在消息队列中。
当然还有一种情况是操作系统直接调用程序的窗口过程。

其实这些东西在Windows程序设计中都有讲的,你最好看一下这本书,然后再读VCL,这样会顺理成章得多。

回家咯。

zhuyif 2006-12-31
  • 打赏
  • 举报
回复
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;

对了,在还没进Application.Run的消息循环前,Application.Initialize;
Application.CreateForm(TForm1, Form1); 的过程中产生的消息谁处理的。
linzhengqun 2006-12-31
  • 打赏
  • 举报
回复
发送到Application的Handle的消息就会被Application.WndProc处理到。
linzhengqun 2006-12-31
  • 打赏
  • 举报
回复
我去吃饭了,回来再说
zhuyif 2006-12-31
  • 打赏
  • 举报
回复
那一般什么消息才会被diaptchmessage进Application.WndProc的??
linzhengqun 2006-12-31
  • 打赏
  • 举报
回复
好,你到TApplication的这个类看一下,里面是不是有一个FHandle成员,这个是程序的隐藏窗口,而Application.WndProc就是专门处理这个隐藏窗口的。

所以DispatchMessage是直接到窗口类的WndProc去了,与Application没有关系的。
zhuyif 2006-12-31
  • 打赏
  • 举报
回复
我进去看了,中午我还把这篇文章打印看了,MakeObjectInstance这个函数解释的比inside vcl还通俗点,(可能我基础差把~~)。现在我想知道就是TApplication.WndProc与指定窗体过程这两个,困扰了我很长时间。一直不明白它们的关系
zhuyif 2006-12-31
  • 打赏
  • 举报
回复
你的意思是DispatchMessage(Msg)之后直接进指定窗口的WndProc,还是两个都进,又或者是一先一后
linzhengqun 2006-12-31
  • 打赏
  • 举报
回复
看代码啊。

TApplication.WndProc是专门处理隐藏在Application类里面的隐藏窗口的,不是Application.Handle,所以这个方法并不是处理程序所有的消息的。

所以DispatchMessage(Msg)之后,其实是转到了指定窗口的窗口过程去了,财由一些转换,最后就到了指定窗口的WndProc去了,看一下Me的这篇文章:
http://blog.csdn.net/linzhengqun/archive/2006/12/20/1451088.aspx
zhuyif 2006-12-31
  • 打赏
  • 举报
回复
各位大哥,帮帮忙啊
zhuyif 2006-12-31
  • 打赏
  • 举报
回复
小弟是新手。再问“wndproc是在Tcontrol类中定义的一个虚拟方法”,那跟procedure TApplication.WndProc(var Message: TMessage)没关系把。TApplication继承自TComponent.还有我在帮助里怎么找不到TApplication.WndProc这个方法
winxkm 2006-12-31
  • 打赏
  • 举报
回复
看来楼主对消息的流程不是很清楚呀
winxkm 2006-12-31
  • 打赏
  • 举报
回复
mainWndProc是定义在wincontrol类中的一个静态方法,不能被重载,它不能直接处理消息,而是交由wndproc方法处理,并在周围提供了异常保护,
wndproc是在Tcontrol类中定义的一个虚拟方法。这就意味着可以覆盖它。提供自定义的消息处理过程。最好调用继承,让父类代为处理你不处理的消息。 它调用disptch方法来进行消息分配。类似于DispatchMessage 其参数是记录类型

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧