TApplication和TForm都注册了窗口类及消息回调函数,应用程序的消息队列只有一个,那么操作系统到底先调用谁的回调函数?这部分我有点晕.请给我详细解释一下好吗?谢谢了!

解决方案 »

  1.   

    應該是先調用TApplicationr的吧, TApplication獲得消息後再交TForm處理吧.
      

  2.   

    應該是先調用TApplication的吧, TApplication獲得消息後再交TForm處理吧.你可看看TApplication的HandleMessage和ProcessMessage兩方法的源碼.
      

  3.   

    to:konhon(优华) 
    ■我很不明白的是:TForm也注册了窗口类和消息回调函数.那么这个函数不是由操作系统直接就调用了吗?怎么会是由TApplication转发给TForm呢?
      

  4.   

    TApplication有一个消息循环,接收Windows发送过来的消息,然后再用DispathMessage分配消息给正确的窗口(根据窗口的Handle)
      

  5.   

    to: linzhengqun(风。我回来了)
    ■我很不明白的是:TForm也注册了窗口类和消息回调函数.那么这个函数不是由操作系统直接就调用了吗?怎么会是由TApplication转发给TForm呢?
      

  6.   

    楼主应该先熟悉一下windows的消息处理机制,不然怎么说你也不明白,另外“Delphi5的开发人员指南”一书中有例子专门说明TApplication和TForm的消息分配机制!
      

  7.   

    准确地说,不是由TApplication转发给TForm的,而是由消息循环,而消息循环就是TApplicatoin当中.去看Windows Programming,然后再来看VCL的源码,就会阔然开朗
      

  8.   

    所有的消息都是由函数wndproc(var msg : TMessage) : virtual来管理
    最开始执行的是@defwindowproc,不过只执行一次,然后由wndproc来接管
    我们的程序都是调用主窗体的消息循环wndproc
      

  9.   

    先调用TApplication
    生成Application后再生成Form
    看看李维的《Inside VCL》就什么全懂了
      

  10.   

    ■我的意思就是想问:
    隐藏的Application窗口向系统注册了回调函数,Form1也向系统注册了回调函数。
    那么系统是不是只调用第一个向他注册的回调函数?
      

  11.   

    注册的回调函数和窗口句柄相关,只会在DispatchMessage这个api中间才会被操作系统调用。所以你的问题是没掌握关键点所在,关键的是要知道谁调用了DispatchMessage这个api,在delphi中是Application.Run这个总循环调用的,它操作的是消息队列,取出系统post的消息然后调用DispatchMessage由操作系统将相应消息传入对应窗口的windowproc回调函数中。