界面的顯示方面就都講完啦,下面來介紹下控件的響應。
前面的教程只講了按鈕和Tab的響應,即在Notify函數裏處理。其實duilib還提供了另外一種響應的方法,即消息映射DUI_BEGIN_MESSAGE_MAP,可以將DUI_MSGTYPE_CLICK消息映射到指定的函數(比如OnClick),這和在Notify判斷msg.sType是一樣的效果,具體請參見duilib的RichListDemo。
先看看下面幾段代碼:
DUI_BEGIN_MESSAGE_MAP(CPage1, CNotifyPump) DUI_ON_MSGTYPE(DUI_MSGTYPE_CLICK,OnClick) DUI_ON_MSGTYPE(DUI_MSGTYPE_SELECTCHANGED,OnSelectChanged) DUI_ON_MSGTYPE(DUI_MSGTYPE_ITEMCLICK,OnItemClick)DUI_END_MESSAGE_MAP()
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){ LRESULT lRes = 0; BOOL bHandled = TRUE; switch (uMsg) { case WM_KEYDOWN: lRes = OnKeyDown(uMsg, wParam, lParam, bHandled); break; case WM_LBUTTONDOWN: lRes = OnLButtonDown(uMsg, wParam, lParam, bHandled); break; case WM_MOUSEMOVE: lRes = OnMouseMove(uMsg, wParam, lParam, bHandled); break; default: bHandled = FALSE; break; } if (bHandled) return lRes; return CWindowWnd::HandleMessage(uMsg, wParam, lParam);}
void Notify(TNotifyUI& msg){ if( msg.sType == _T("windowinit") ) { } else if( msg.sType == _T("click") ) { }}
我們再來看看MFC的兩段代碼:
BEGIN_MESSAGE_MAP(CMFCDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON_ADD_FILES, &CMFCDlg::OnBnClickedButtonAddFiles) ON_BN_CLICKED(IDC_BUTTON_CLEAR_FILES, &CMFCDlg::OnBnClickedButtonClearFiles) ON_BN_CLICKED(IDC_BUTTON_DELETE_FILES, &CMFCDlg::OnBnClickedButtonDeleteFiles)END_MESSAGE_MAP()
LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam){ LRESULT lRes = 0; switch (uMsg) { case WM_KEYDOWN: lRes = OnKeyDown(uMsg, wParam, lParam, bHandled); break; case WM_LBUTTONDOWN: lRes = OnLButtonDown(uMsg, wParam, lParam, bHandled); break; case WM_MOUSEMOVE: lRes = OnMouseMove(uMsg, wParam, lParam, bHandled); break; default: break; } return CDialog::DefWindowProc(uMsg, wParam, lParam);}
很明顯,duilib參考了MFC、ATL/WTL的消息機制:
1、DUI_BEGIN_MESSAGE_MAP類似於MFC的BEGIN_MESSAGE_MAP。
2、HandleMessage類似於MFC的DefWindowProc。
不過需要注意參數bHandled,這個參數是模仿ATL的。bHandled在ATL中的作用如下:
在消息響應函數調用前被ATL設置爲TRUE,如果在你的消息響應處理完之後需要ATL調用默認的WindowProc()處理該消息,你可以將bHandled設置爲FALSE。這與MFC不同, MFC是顯式地調用基類的響應函數來實現的默認的消息處理的。
3、不過duilib還提供了另外一個函數,即Notify函數,Notify用於處理duilib自己定義的一套消息,其消息類型請參見duilib的UIDefine.h:
//定義所有消息類型////////////////////////////////////////////////////////////////////////// #define DUI_MSGTYPE_MENU (_T("menu"))#define DUI_MSGTYPE_LINK (_T("link")) #define DUI_MSGTYPE_TIMER (_T("timer"))#define DUI_MSGTYPE_CLICK (_T("click")) #define DUI_MSGTYPE_RETURN (_T("return"))#define DUI_MSGTYPE_SCROLL (_T("scroll")) #define DUI_MSGTYPE_DROPDOWN (_T("dropdown"))#define DUI_MSGTYPE_SETFOCUS (_T("setfocus")) #define DUI_MSGTYPE_KILLFOCUS (_T("killfocus"))#define DUI_MSGTYPE_ITEMCLICK (_T("itemclick"))#define DUI_MSGTYPE_TABSELECT (_T("tabselect")) #define DUI_MSGTYPE_ITEMSELECT (_T("itemselect"))#define DUI_MSGTYPE_ITEMEXPAND (_T("itemexpand"))#define DUI_MSGTYPE_WINDOWINIT (_T("windowinit"))#define DUI_MSGTYPE_BUTTONDOWN (_T("buttondown"))#define DUI_MSGTYPE_MOUSEENTER (_T("mouseenter"))#define DUI_MSGTYPE_MOUSELEAVE (_T("mouseleave")) #define DUI_MSGTYPE_TEXTCHANGED (_T("textchanged"))#define DUI_MSGTYPE_HEADERCLICK (_T("headerclick"))#define DUI_MSGTYPE_ITEMDBCLICK (_T("itemdbclick"))#define DUI_MSGTYPE_SHOWACTIVEX (_T("showactivex")) #define DUI_MSGTYPE_ITEMCOLLAPSE (_T("itemcollapse"))#define DUI_MSGTYPE_ITEMACTIVATE (_T("itemactivate"))#define DUI_MSGTYPE_VALUECHANGED (_T("valuechanged")) #define DUI_MSGTYPE_SELECTCHANGED (_T("selectchanged"))
到這裏,duilib的消息機制就很明朗啦,只要熟悉windows消息機制的,稍微看看Demo就懂啦;不熟悉windows消息機制的,一時半會就說不清楚啦,還請先學習好 【2013 duilib入門簡明教程 -- VS環境配置(2)】中推薦的資料吧~O(∩_∩)O~