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定义事件对应的处理函数
示例代码见附件。
附件:http://down.51cto.com/data/2366182
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享名称:Duilib中的消息泵和虚拟窗口-创新互联
网址分享:http://ybzwz.com/article/pdhos.html