Duilib擴展《01》— 雙擊、右鍵消息擴展


用過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())
    {
       // ...
    }
}

這樣一來,即可響應雙擊消息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM