用過duilib的可能會發現,duilib中有些控件沒能很好的區分左鍵、右鍵等消息。所以根據實際需要,我們需要進行相關區分處理,或者自行擴展。
一. 左鍵、右鍵消息區分
我們以CListUI控件來分析說明。對於CListUI控件,在實際應用中有時我們需要響應雙擊或右鍵消息來執行不同操作,而目前的duilib中CListUI控件Item選擇是無法區分左鍵右鍵消息的,究其原因duilib中對這塊的處理都是發送的itemclick消息。具體可查看duilib中UIList.cpp文件中CListContainerElementUI::DoEvent部分的源碼的處理:
if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_RBUTTONDOWN ) { if( IsEnabled() ){ m_pManager->SendNotify(this, DUI_MSGTYPE_ITEMCLICK); Select(); Invalidate(); } return; }
解決的辦法可以區分type類型發送不同的event。
二. 消息擴展
我們以添加雙擊消息為例來說明。在Duilib學習筆記《05》——消息響應處理中,我們已經簡單了提到了duilib中對相關操作的自定義的消息類型,可以在duilib工程中的UIDefine.h中查看。
1)消息定義
類似的,我們擴展消息也需要在此添加。我們可以發現在UIDefine.h中已經定義了click的消息:#define DUI_MSGTYPE_CLICK (_T(“click”)),卻沒看到雙擊消息。對應的,我們在此處添加一個雙擊消息:#define DUI_MSGTYPE_DBCLICK (_T(“dbclick”))
2)消息傳遞
在UIManager.h文件中我們可以看到已經定義了UIEVENT_DBLCLICK、UIEVENT_RBUTTONDOWN等事件消息,這是因為它的右鍵和雙擊等消息只給了內部的控件使用,我們需要將其傳遞出來,所以在UIControl.cpp文件的CControlUI::DoEvent中傳遞雙擊消息。如下:
if( event.Type == UIEVENT_DBLCLICK ) { m_pManager->SendNotify(this, DUI_MSGTYPE_DBCLICK, event.wParam, event.lParam); // return; }
提醒:這里不要return,因為雙擊消息UIEVENT_DBLCLICK還需要傳遞給List等控件。
3)消息處理
最后,在外部使用時,在Notify函數中根據實際情況進行消息判斷處理:
if( msg.sType == _T("dbclick")) { // 此處會傳遞很多次雙擊消息,所以只獲取父類控件的消息 if (! msg.pSender->GetParent()) { // ... } }
這樣一來,即可響應雙擊消息。