从品牌网站建设到网络营销策划,从策略到执行的一站式服务
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定义事件对应的处理函数
示例代码见附件。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
成都网站建设公司地址:成都市青羊区太升南路288号锦天国际A座10层 建设咨询028-86922220
成都快上网科技有限公司-四川网站建设设计公司 | 蜀ICP备19037934号 Copyright 2020,ALL Rights Reserved cdkjz.cn | 成都网站建设 | © Copyright 2020版权所有.
专家团队为您提供成都网站建设,成都网站设计,成都品牌网站设计,成都营销型网站制作等服务,成都建网站就找快上网! | 成都网站建设哪家好? | 网站建设地图