温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Duilib中的消息泵和虚拟窗口

发布时间:2020-06-19 03:26:08 来源:网络 阅读:6249 作者:watertoeast 栏目:开发技术

                                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
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI