溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Duilib中的消息泵和虛擬窗口

發(fā)布時(shí)間:2020-06-19 03:26:08 來(lái)源:網(wǎng)絡(luò) 閱讀:6239 作者:watertoeast 欄目:開發(fā)技術(shù)

                                Duilib中的消息泵和虛擬窗口


一、消息泵的結(jié)構(gòu)

CNotifyPump類是構(gòu)建Duilib消息泵的根父類,要使用消息泵機(jī)制的窗口類應(yīng)該從該類繼承。在繼承關(guān)系的基礎(chǔ)上,通過(guò)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等宏構(gòu)建消息泵的鏈表結(jié)構(gòu)以及事件與處理函數(shù)的對(duì)應(yīng)關(guān)系。具體的實(shí)現(xiàn)方式參考了MFC的消息機(jī)制。



二、消息泵的處理流程

WindowImplBase的OnCreate函數(shù)默認(rèn)會(huì)將自身添加成CPaintManagerUI Notify消息的Notifier,WindowImplBase對(duì)象相當(dāng)于是事件消息的一個(gè)監(jiān)聽(tīng)者,當(dāng)有事件發(fā)生時(shí),會(huì)調(diào)用WindowImplBase的Notify函數(shù),而Notify函數(shù)會(huì)調(diào)用CNotifyPump::NotifyPump進(jìn)入消息泵。進(jìn)入消息泵后,先查看當(dāng)前窗口類中有無(wú)虛擬窗口對(duì)事件進(jìn)行處理,如果沒(méi)有,就查找當(dāng)前窗口類是否有函數(shù)對(duì)其進(jìn)行處理,如果沒(méi)有,進(jìn)入父類進(jìn)行類似查找,直到CNotifyPump類。


三、虛擬窗口的使用

CNotifyPump::m_VirtualWndMap提供了對(duì)虛擬窗口的管理功能。所謂虛擬窗口,就是一個(gè)假的窗口,不需要從CWindowWnd類繼承,實(shí)際上,Duilib用一個(gè)字符串來(lái)標(biāo)示(代表)一個(gè)虛擬窗口。利用虛擬窗口,可截獲消息泵中發(fā)送給對(duì)應(yīng)真實(shí)窗口的消息進(jìn)行處理,而使真實(shí)窗口無(wú)法捕獲該消息。具體使用步驟如下

1、從CNotifyPump繼承生成一個(gè)虛擬窗口類,假設(shè)為CMyVirtualWnd

2、在實(shí)例化真實(shí)窗口類后,實(shí)例化一個(gè)CMyVirtualWnd類對(duì)象,并通過(guò)真實(shí)窗口類的AddVirtualWnd添加前面實(shí)例化的虛擬窗口對(duì)象,假設(shè)AddVirtualWnd指定虛擬窗口對(duì)象對(duì)應(yīng)名稱為VWnd

3、將要交給虛擬窗口對(duì)象處理的事件的sVirtualWnd賦值為VWnd

4、利用DUI_ON_MSGTYPE等宏,在CMyVirtualWnd定義事件對(duì)應(yīng)的處理函數(shù)


示例代碼見(jiàn)附件。

附件:http://down.51cto.com/data/2366182
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI