2013 duilib入門簡明教程 -- 事件處理和消息響應 (17)


    界面的顯示方面就都講完啦,下面來介紹下控件的響應。
    前面的教程只講了按鈕和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~






免責聲明!

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



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