前言
DuiLib中的某些控件不能很好的區分鼠標左擊、右擊和雙擊等操作,如樹控件,但實際應用中又需要。對于這樣的情況,我們可以通過修改界面庫源碼來擴展控件的功能。
原因分析
以樹控件為例來說明。樹控件之所以不支持鼠標右擊,是因為DuiLib對樹控件的鼠標左擊事件和右擊事件都發送了DUI_MSG_ITEMCLICK消息。具體可以查看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;
}
消息擴展
以擴展樹控件的鼠標右擊來說明。
- 消息定義
在UIDefine.h文件中添加自定義消息。#define DUI_MSGTYPE_ITEMRCLICK (_T("itemrclick"))
- 消息傳遞
修改UIList.cpp文件中的CListContainerElementUI::DoEvent函數,讓鼠標左擊事件和右擊事件發送不同的消息。if( event.Type == UIEVENT_BUTTONDOWN ) { if( IsEnabled() ) { m_pManager->SendNotify(this, DUI_MSGTYPE_ITEMCLICK); Select(); Invalidate(); } return; } if ( event.Type == UIEVENT_RBUTTONDOWN ) { if ( IsEnabled()) { m_pManager->SendNotify(this, DUI_MSGTYPE_ITEMRCLICK); Select(); Invalidate(); } return; }
- 消息處理
在使用樹控件的類的Notify函數中處理消息。if (msg.sType == DUI_MSGTYPE_ITEMRCLICK) { // 其他操作 }