• duilib教程之duilib入门简明教程17.事件处理和消息响应


     界面的显示方面就都讲完啦,下面来介绍下控件的响应。    前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理。其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEGIN_MESSAGE_MAP,可以将DUI_MSGTYPE_CLICK消息映射到指定的函数(比如OnClick),这和在Notify判断msg.sType是一样的效果,具体请参见duilib的RichListDemo。
        先看看下面几段代码:


    1. DUI_BEGIN_MESSAGE_MAP(CPage1, CNotifyPump)
    2.     DUI_ON_MSGTYPE(DUI_MSGTYPE_CLICK,OnClick)
    3.     DUI_ON_MSGTYPE(DUI_MSGTYPE_SELECTCHANGED,OnSelectChanged)
    4.     DUI_ON_MSGTYPE(DUI_MSGTYPE_ITEMCLICK,OnItemClick)
    5. DUI_END_MESSAGE_MAP()
    复制代码


    1. LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
    2. {
    3.     LRESULT lRes = 0;
    4.     BOOL bHandled = TRUE;
    5.     switch (uMsg)
    6.     {
    7.     case WM_KEYDOWN:        lRes = OnKeyDown(uMsg, wParam, lParam, bHandled); break;
    8.     case WM_LBUTTONDOWN:    lRes = OnLButtonDown(uMsg, wParam, lParam, bHandled); break;
    9.     case WM_MOUSEMOVE:      lRes = OnMouseMove(uMsg, wParam, lParam, bHandled); break;
    10.     default:                bHandled = FALSE; break;
    11.     }
    12.     if (bHandled) return lRes;
    13.     return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
    14. }
    复制代码



    1. void Notify(TNotifyUI& msg)
    2. {
    3.     if( msg.sType == _T("windowinit") )
    4.     {
    5.     }      
    6.     else if( msg.sType == _T("click") )
    7.     {
    8.     }
    9. }  
    复制代码









        我们再来看看MFC的两段代码:

    1. BEGIN_MESSAGE_MAP(CMFCDlg, CDialog)
    2.     ON_BN_CLICKED(IDC_BUTTON_ADD_FILES, &CMFCDlg::OnBnClickedButtonAddFiles)
    3.     ON_BN_CLICKED(IDC_BUTTON_CLEAR_FILES, &CMFCDlg::OnBnClickedButtonClearFiles)
    4.     ON_BN_CLICKED(IDC_BUTTON_DELETE_FILES, &CMFCDlg::OnBnClickedButtonDeleteFiles)
    5. END_MESSAGE_MAP()
    复制代码





    1. LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
    2. {
    3.     LRESULT lRes = 0;
    4.     switch (uMsg)
    5.     {
    6.     case WM_KEYDOWN:        lRes = OnKeyDown(uMsg, wParam, lParam, bHandled); break;
    7.     case WM_LBUTTONDOWN:    lRes = OnLButtonDown(uMsg, wParam, lParam, bHandled); break;
    8.     case WM_MOUSEMOVE:      lRes = OnMouseMove(uMsg, wParam, lParam, bHandled); break;
    9.     default:                break;
    10.     }
    11.     return CDialog::DefWindowProc(uMsg, wParam, lParam);
    12. }
    复制代码





        很明显,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:


    1. //定义所有消息类型
    2. //////////////////////////////////////////////////////////////////////////
    3. #define DUI_MSGTYPE_MENU                   (_T("menu"))
    4. #define DUI_MSGTYPE_LINK                   (_T("link"))
    5. #define DUI_MSGTYPE_TIMER                  (_T("timer"))
    6. #define DUI_MSGTYPE_CLICK                  (_T("click"))
    7. #define DUI_MSGTYPE_RETURN                 (_T("return"))
    8. #define DUI_MSGTYPE_SCROLL                 (_T("scroll"))
    9. #define DUI_MSGTYPE_DROPDOWN               (_T("dropdown"))
    10. #define DUI_MSGTYPE_SETFOCUS               (_T("setfocus"))
    11. #define DUI_MSGTYPE_KILLFOCUS              (_T("killfocus"))
    12. #define DUI_MSGTYPE_ITEMCLICK              (_T("itemclick"))
    13. #define DUI_MSGTYPE_TABSELECT              (_T("tabselect"))
    14. #define DUI_MSGTYPE_ITEMSELECT             (_T("itemselect"))
    15. #define DUI_MSGTYPE_ITEMEXPAND             (_T("itemexpand"))
    16. #define DUI_MSGTYPE_WINDOWINIT             (_T("windowinit"))
    17. #define DUI_MSGTYPE_BUTTONDOWN             (_T("buttondown"))
    18. #define DUI_MSGTYPE_MOUSEENTER             (_T("mouseenter"))
    19. #define DUI_MSGTYPE_MOUSELEAVE             (_T("mouseleave"))
    20. #define DUI_MSGTYPE_TEXTCHANGED            (_T("textchanged"))
    21. #define DUI_MSGTYPE_HEADERCLICK            (_T("headerclick"))
    22. #define DUI_MSGTYPE_ITEMDBCLICK            (_T("itemdbclick"))
    23. #define DUI_MSGTYPE_SHOWACTIVEX            (_T("showactivex"))
    24. #define DUI_MSGTYPE_ITEMCOLLAPSE           (_T("itemcollapse"))
    25. #define DUI_MSGTYPE_ITEMACTIVATE           (_T("itemactivate"))
    26. #define DUI_MSGTYPE_VALUECHANGED           (_T("valuechanged"))
    27. #define DUI_MSGTYPE_SELECTCHANGED          (_T("selectchanged"))
    复制代码





        到这里,duilib的消息机制就很明朗啦,只要熟悉windows消息机制的,稍微看看Demo就懂啦;不熟悉windows消息机制的,一时半会就说不清楚啦,还请先学习好 【2013 duilib入门简明教程 -- VS环境配置(2)】中推荐的资料吧~O(∩_∩)O~

  • 相关阅读:
    面试题:最小的K个数
    面试题:反转链表
    面试题:二进制中1的个数
    数据结构之二叉树
    Serializable-源码分析
    归并、希尔、快速排序
    栈与队列
    简单排序(冒泡、选择、插入)
    Shiro 框架认证和授权
    mybatis select查询使用返回结果为resultMap
  • 原文地址:https://www.cnblogs.com/blogpro/p/11427104.html
Copyright © 2020-2023  润新知