Duilib中的消息泵和虚拟窗口

                                Duilib中的消息泵和虚拟窗口


一、消息泵的结构

CNotifyPump类是构建Duilib消息泵的根父类,要使用消息泵机制的窗口类应该从该类继承。在继承关系的基础上,通过DUI_DECLARE_MESSAGE_MAP、DUI_BEGIN_MESSAGE_MAP、DUI_END_MESSAGE_MAP、DUI_ON_MSGTYPE、DUI_ON_MSGTYPE_CTRNAME、DUI_ON_CLICK_CTRNAME、DUI_ON_SELECTCHANGED_CTRNAME、DUI_ON_KILLFOCUS_CTRNAME、DUI_ON_MENU_CTRNAME、DUI_ON_TIMER等宏构建消息泵的链表结构以及事件与处理函数的对应关系。具体的实现方式参考了MFC的消息机制。



二、消息泵的处理流程

WindowImplBase的OnCreate函数默认会将自身添加成CPaintManagerUI Notify消息的Notifier,WindowImplBase对象相相当于是事件消息的一个监听者,当有事件发生时,会调用WindowImplBase的Notify函数,而Notify函数会调用CNotifyPump::NotifyPump进入消息泵。进入消息泵后,先查看当前窗口类中有无虚拟窗口对事件进行处理,如果没有,就查找当前窗口类是否有函数对其进行处理,如果没有,进入父类进行类似查找,直到CNotifyPump类。


三、虚拟窗口的使用

CNotifyPump::m_VirtualWndMap提供了对虚拟窗口的管理功能。所谓虚拟窗口,就是一个假的窗口,不需要从CWindowWnd类继承,实际上,Duilib用一个字符串来标示(代表)一个虚拟窗口。利用虚拟窗口,可截获消息泵中发送给对应真实窗口的消息进行处理,而使真实窗口无法捕获该消息。具体使用步骤如下

1、从CNotifyPump继承生成一个虚拟窗口类,假设为CMyVirtualWnd

2、在实例化真实窗口类后,实例化一个CMyVirtualWnd类对象,并通过真实窗口类的AddVirtualWnd添加前面实例化的虚拟窗口对象,假设AddVirtualWnd指定虚拟窗口对象对应名称为VWnd

3、将要交给虚拟窗口对象处理的事件的sVirtualWnd赋值为VWnd

4、利用DUI_ON_MSGTYPE等宏,在CMyVirtualWnd定义事件对应的处理函数


示例代码见附件。

本文出自 “IT技术分享” 博客,转载请与作者联系!

你可能感兴趣的:(duilib)