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定义事件对应的处理函数
示例代码见附件。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。