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

解决方案 »

  1.   

    mainWndProc是定义在wincontrol类中的一个静态方法,不能被重载,它不能直接处理消息,而是交由wndproc方法处理,并在周围提供了异常保护,
    wndproc是在Tcontrol类中定义的一个虚拟方法。这就意味着可以覆盖它。提供自定义的消息处理过程。最好调用继承,让父类代为处理你不处理的消息。 它调用disptch方法来进行消息分配。类似于DispatchMessage 其参数是记录类型
      

  2.   

    小弟是新手。再问“wndproc是在Tcontrol类中定义的一个虚拟方法”,那跟procedure TApplication.WndProc(var Message: TMessage)没关系把。TApplication继承自TComponent.还有我在帮助里怎么找不到TApplication.WndProc这个方法
      

  3.   

    看代码啊。TApplication.WndProc是专门处理隐藏在Application类里面的隐藏窗口的,不是Application.Handle,所以这个方法并不是处理程序所有的消息的。所以DispatchMessage(Msg)之后,其实是转到了指定窗口的窗口过程去了,财由一些转换,最后就到了指定窗口的WndProc去了,看一下Me的这篇文章:
    http://blog.csdn.net/linzhengqun/archive/2006/12/20/1451088.aspx
      

  4.   

    你的意思是DispatchMessage(Msg)之后直接进指定窗口的WndProc,还是两个都进,又或者是一先一后
      

  5.   

    我进去看了,中午我还把这篇文章打印看了,MakeObjectInstance这个函数解释的比inside vcl还通俗点,(可能我基础差把~~)。现在我想知道就是TApplication.WndProc与指定窗体过程这两个,困扰了我很长时间。一直不明白它们的关系
      

  6.   

    好,你到TApplication的这个类看一下,里面是不是有一个FHandle成员,这个是程序的隐藏窗口,而Application.WndProc就是专门处理这个隐藏窗口的。所以DispatchMessage是直接到窗口类的WndProc去了,与Application没有关系的。
      

  7.   

    那一般什么消息才会被diaptchmessage进Application.WndProc的??
      

  8.   

    发送到Application的Handle的消息就会被Application.WndProc处理到。
      

  9.   

    Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;对了,在还没进Application.Run的消息循环前,Application.Initialize;
      Application.CreateForm(TForm1, Form1); 的过程中产生的消息谁处理的。
      

  10.   

    你首先要明白为什么会有消息,那就是在Run里面,程序主动去消息队列中取消息。
    所以在Run之前的消息都放在消息队列中。
    当然还有一种情况是操作系统直接调用程序的窗口过程。其实这些东西在Windows程序设计中都有讲的,你最好看一下这本书,然后再读VCL,这样会顺理成章得多。回家咯。