1. 程式人生 > >【duilib進階】自定義控制元件響應指定命令

【duilib進階】自定義控制元件響應指定命令

duilib在UIManager.h裡的EVENTTYPE_UI列舉裡定義了很多控制元件命令,如字元輸入、雙擊、滑鼠離開等等,然而這些事件不是在所有控制元件上都會得到處理,所以當我們有需要響應這些事件而對應的原生控制元件又沒有處理時,那就要自己派生一個控制元件去處理這個的事情了。方法很簡單:繼承需要的控制元件,然後覆蓋它的虛擬函式virtual void DoEvent(TEventUI& event),呼叫SendNotify函式,把要處理的事件告訴UIManager。這樣控制元件所在的對話方塊就能收到對應該事件的訊息。

下面舉個例子,讓CHorizontalLayoutUI響應滑鼠進入

事件,效果如下:


第一步:自定義新控制元件,繼承CHorizontalLayoutUI

class CHorizontalLayoutUIEx : public CHorizontalLayoutUI
{
public:
	virtual void DoEvent(TEventUI& event); //覆蓋處理UI事件的虛擬函式
	const static CDuiString controlLabel;
};

第二步:實現DoEvent()函式,轉發UIEVENT_MOUSEENTER通知
void CHorizontalLayoutUIEx::DoEvent( TEventUI& event )
{
	if( event.Type == UIEVENT_MOUSEENTER )
	{
		//告訴UIManager這個訊息需要處理
		m_pManager->SendNotify(this, DUI_MSGTYPE_MOUSEENTER);
		return;
	}
	
	//其他事件用父類方法處理
	__super::DoEvent(event);
}

第三部:在使用該控制元件的介面類響應上一步通知的訊息

標頭檔案宣告:

class MainDlg:	public WindowImplBase
{
public:
    DUI_DECLARE_MESSAGE_MAP(); //宣告<訊息,響應函式>對映
    void OnMouseEnter(TNotifyUI& msg); //宣告滑鼠進入響應函式 
}

cpp實現:
//定義<訊息,響應函式>對映關係
DUI_BEGIN_MESSAGE_MAP(MainDlg,WindowImplBase)
	DUI_ON_MSGTYPE(DUI_MSGTYPE_MOUSEENTER,OnMouseEnter)
	DUI_END_MESSAGE_MAP()

//滑鼠進入響應函式實現
void MainDlg::OnMouseEnter( TNotifyUI& msg )
{
	CDuiString controlName = msg.pSender->GetName();
	if ( controlName == _T("optALayout") || controlName == _T("optBLayout") ||
		controlName == _T("optCLayout") || controlName == _T("optDLayout"))
	{
		CHorizontalLayoutUI* layout = dynamic_cast<CHorizontalLayoutUI*>(msg.pSender);
		layout->SetBorderColor(0xFF58A1CC); //設定描邊顏色
		layout->SetBorderSize(1); //設定描邊寬度
		CControlUI* deleteBtn = layout->FindSubControl(_T("delete"));
		deleteBtn->SetVisible(true);
	}
}

大功告成!