最近要把一个delphi的库移植成c++的代码,在看delphi的代码,在看到有关vcl中的组件的窗口消息处理的部分的时候,有点疑问,delphi对窗口的消息进行了更高级的封装,我看到有个tmessage类,现在在看vcl的代码的时候有点问题,对于delphi中的form和button来说,可以使用事件响应过程来对相应的消息进行处理,我看了一下delphi的代码,TForm就有一个属性OnMouseMove,然后在编程的时候,在f11调出的object inspector窗口中把对应的procedure设置好,在mousemove的时候,就会调用这个过程,也就是说,在程序运行的时候,发生的wm_mousemove消息,程序会调用OnMouseMove属性中设置的过程进行处理,但是,我不知道这里面具体实现的细节是这么个样子。还有,从TComponent中继承的类都有代表父子关系的成员可以调用,也就是说一个button可以取得包含它的窗口,一个form窗口可以取得在其中的所有子component,由于没有对vcl库的代码进一步的了解,我不知道发生在一个button上的mousemove消息是如何被处理的,是直接被发送到button的窗口过程还是先被发送到form的窗口处理过程,然后通过查找,找到对应的button再进行处理的。我想问的是:vcl中的一个窗口程序消息处理的流程大概是怎么一个样子的。对于form中的子component,其消息的发送是怎样一个过程,是只有form一级的类有窗口消息处理函数,消息先分发到form的消息处理过程,然后通过一定的方式找到子组件并进行处理还是没一种带有窗口的组件都有消息处理过程,消息被直接分发到对应的组件的消息处理过程。希望熟悉vcl库的人指教一下,谢谢。

解决方案 »

  1.   

    你可以参考:李维的《VCL架构剖析》,是根据主窗口注册的回调函数提供的机制来处理消息队列中的消息的,用到了堆栈指针,我没有详细看,你可以参考一下!
      

  2.   

    自己顶一下,请delphi高手指教一下.
      

  3.   

    1,
    TObject,
    //分发消息。
    procedure Dispatch(var Message); virtual;
    //默认消息处理
    procedure DefaultHandler(var Message); virtual;
    2,
    //很多地方 
    采用了  broadcast 模式 (广播 消息)。
         和 Facade    门面模式 发布消息。
    3,
    FOnClick: TNotifyEvent;
    TNotifyEvent
    采用了观察者模式。
    Inside VCL ,Delphi 模式编程。
    4,
    慢慢研究。
      

  4.   

    找Delphi5开发人员指南中有专门章节论述,可以到www.2ccc.com下载中文电子版