上一個Hello World的教程里有一句代碼是這樣的:CControlUI *pWnd = new CButtonUI;
也就是說,其實那整塊綠色背景區域都是按鈕的區域。(
這里簡要介紹下,CControlUI 是duilib中所有控件的基類,而CButtonUI則是按鈕類,更多的控件會在后面的教程一一介紹。)
那么怎樣響應按鈕的點擊消息呢
?
我們需要幾個步驟:
1、調用AddNotifier函數將消息加入duilib的消息循環
2、給按鈕設置一個唯一的控件ID(SetName函數)
3、在Notify函數里處理按鈕點擊消息。
代碼如下:
class CDuiFrameWnd : public CWindowWnd, public INotifyUI { public: virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); } virtual void Notify(TNotifyUI& msg) { if(msg.sType == _T("click")) { if(msg.pSender->GetName() == _T("btnHello")) { ::MessageBox(NULL, _T("我是按鈕"), _T("點擊了按鈕"), NULL); } } } virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT lRes = 0; if( uMsg == WM_CREATE ) { CControlUI *pWnd = new CButtonUI; pWnd->SetName(_T("btnHello")); // 設置控件的名稱,這個名稱用於標識每一個控件,必須唯一,相當於MFC里面的控件ID pWnd->SetText(_T("Hello World")); // 設置文字 pWnd->SetBkColor(0xFF00FF00); // 設置背景色 m_PaintManager.Init(m_hWnd); m_PaintManager.AttachDialog(pWnd); m_PaintManager.AddNotifier(this); // 添加控件等消息響應,這樣消息就會傳達到duilib的消息循環,我們可以在Notify函數里做消息處理 return lRes; } if( m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) ) { return lRes; } return __super::HandleMessage(uMsg, wParam, lParam); } protected: CPaintManagerUI m_PaintManager; };
運行結果如圖: