界面的显示方面就都讲完啦,下面来介绍下控件的响应。    前面的教程只讲了按钮和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~

duilib教程之duilib入门简明教程17.事件处理和消息响应的更多相关文章

  1. duilib教程之duilib入门简明教程14.部分bug 2

    上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃      如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口都用new生成,_t ...

  2. duilib教程之duilib入门简明教程15.自绘控件

    在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如菜单控件 ...

  3. duilib教程之duilib入门简明教程13.复杂控件介绍

    首先将本节要介绍的控件全部拖到界面上,并调整好位置,如图:  然后将Name属性改成其他名字,         不能是[控件名+UI+数字]这种,因为这是DuiDesigner默认的名字,它不会实际写 ...

  4. duilib教程之duilib入门简明教程11.部分bug

    一.WindowImplBase的bug    在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,    1.最大化按钮的样式还是没 ...

  5. duilib教程之duilib入门简明教程3.第一个程序 Hello World

    小伙伴们有点迫不及待了么,来看一看Hello World吧:新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #in ...

  6. duilib教程之duilib入门简明教程6.XML配置界面

    前面那些教程都是为了让小伙伴们从win32.MFC过渡到duilib,让大家觉得duilib不是那么陌生,如果大家现在还对duilib非常陌生的话,那就说明前面的教程做得不好,请大家在下面留言,我会一 ...

  7. duilib教程之duilib入门简明教程1.前言

    关于duilib的介绍就不多讲了,一来不熟,二来小伙伴们想必已经对比了多个界面库,也无需赘述.下面进入正题:    不看广告看疗效! 已有众多知名公司采用duilib做为界面库,如华为网盘.PPS(P ...

  8. duilib教程之duilib入门简明教程5.自绘标题栏

    如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理.如果用duilib,就是小case啦.    duilib其实并没有区分标题栏和 ...

  9. duilib教程之duilib入门简明教程4.响应按钮事件

    上一个Hello World的教程里有一句代码是这样的:CControlUI *pWnd = new CButtonUI;    也就是说,其实那整块绿色背景区域都是按钮的区域.(这里简要介绍下,CC ...

随机推荐

  1. 个人使用Viso绘制的简单神经网络实现原理图

  2. MonkeyTalk使用方法

    1.简单介绍 MonkeyTalk软件测试工具由两部分构成:MonkeyTalk IDE 和 MonkeyTalk Agents MonkeyTalk IDE是Eclipse平台的工具,工能是:对iO ...

  3. Centos 安装php Imagick 扩展

    从 centos 仓库安装 首先安装 php-pear php-devel,gcc三个软件包 yum install php-pear php-devel gcc 通过 yum 安装Centos 官方 ...

  4. ajax-jq

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. SQLServer2008上的SDE备份和还原

    一.备份 右键数据库>任务>备份.选择完整模式,导出为xxx.bak文件即可. 二.还原 1.创建sde用户名,新建同名数据库xxx,并指定sde为xxx的拥有者. 2.在master上创 ...

  6. Perl 运算符

    Perl 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号,如: 3+2=5. Perl 语言内置了丰富的运算符,我们来看下常用的几种: 算术运算符 比较运算符 逻辑运算符 赋值运算符 位 ...

  7. javascript中的select、checkbox

    遍历checkbox <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...

  8. 单调栈(最大子矩形强化版)——牛客多校第八场A

    求01矩阵里有多少个不同的1矩阵 首先预处理出pre[i][j]表示i上面连续的1个数,对每行的高度进行单调栈处理 栈里的元素维护两个值:pre[i][j]和向前延伸最多能维护的位置pos 然后算贡献 ...

  9. Kafka Streams详细

    概述 1 Kafka Streams Kafka Streams.Apache Kafka开源项目的一个组成部分.是一个功能强大,易于使用的库.用于在Kafka上构建高可分布式.拓展性,容错的应用程序 ...

  10. CF1265B Beautiful Numbers

    题意 给一个长度为\(n\)的排列\(P\),求对于\(1\) 到 \(n\)中的每个数\(m\),是否能找到一段长度为\(m\)的区间使得区间内的数是一个\(1\)到\(m\)的排列. 输出一个\( ...