duilib教程之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~
duilib教程之duilib入门简明教程17.事件处理和消息响应的更多相关文章
- duilib教程之duilib入门简明教程14.部分bug 2
上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃 如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口都用new生成,_t ...
- duilib教程之duilib入门简明教程15.自绘控件
在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如菜单控件 ...
- duilib教程之duilib入门简明教程13.复杂控件介绍
首先将本节要介绍的控件全部拖到界面上,并调整好位置,如图: 然后将Name属性改成其他名字, 不能是[控件名+UI+数字]这种,因为这是DuiDesigner默认的名字,它不会实际写 ...
- duilib教程之duilib入门简明教程11.部分bug
一.WindowImplBase的bug 在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题, 1.最大化按钮的样式还是没 ...
- duilib教程之duilib入门简明教程3.第一个程序 Hello World
小伙伴们有点迫不及待了么,来看一看Hello World吧:新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #in ...
- duilib教程之duilib入门简明教程6.XML配置界面
前面那些教程都是为了让小伙伴们从win32.MFC过渡到duilib,让大家觉得duilib不是那么陌生,如果大家现在还对duilib非常陌生的话,那就说明前面的教程做得不好,请大家在下面留言,我会一 ...
- duilib教程之duilib入门简明教程1.前言
关于duilib的介绍就不多讲了,一来不熟,二来小伙伴们想必已经对比了多个界面库,也无需赘述.下面进入正题: 不看广告看疗效! 已有众多知名公司采用duilib做为界面库,如华为网盘.PPS(P ...
- duilib教程之duilib入门简明教程5.自绘标题栏
如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理.如果用duilib,就是小case啦. duilib其实并没有区分标题栏和 ...
- duilib教程之duilib入门简明教程4.响应按钮事件
上一个Hello World的教程里有一句代码是这样的:CControlUI *pWnd = new CButtonUI; 也就是说,其实那整块绿色背景区域都是按钮的区域.(这里简要介绍下,CC ...
随机推荐
- unicode_stop - 撤销控制台unicode模式(例如, 回到8-bit模式).
总览 unicode_stop 描述 unicode_stop 撤销以前 unicode_start(1) 命令的效果, 将显示屏和键盘设回到 8-bit 模式.
- GYM 101933E 状态压缩 + 记忆化搜索
题意:我方有n个士兵,敌方有m个,每方士兵都有一个血量,现在有k轮无差别炮火打击,每次都会从存活的士兵中随机选一人,这名士兵的HP就-1,问对方被团灭的概率有多大? 思路:因为n和m的范围很小,我们可 ...
- javascript 跨域问题 jsonp
转载:http://www.cnblogs.com/choon/p/5393682.html demo 用动态创建<script></script>节点的方式实现了跨域HTTP ...
- Python 分布式锁
1,数据一致性 当多个进程/线程对同一个共享资源读写,会因为资源的争夺而出现混乱,导致数据不一致. 如下图: 在数据库的原始数据是 d0,上图的处理流程如下: t1 时刻,有两个数据源的数据 d1,d ...
- Jmeter-【beanshell处理器】-随机获取手机号
一.通过操作变量 二.引用外部Java文件 三.引用外部class文件
- magento 跳转
Magento: Redirect functions 原文:http://blog.chapagain.com.np/magento-redirect-functions/ The redirect ...
- Delphi exe实例之间传递cmd参数
{Unit1.pas} 通过这个单元的Button,调用另一个实例: procedure TForm1.Button1Click(Sender: TObject); begin ShellExecut ...
- sql中desc的妙用
很多情况下对表内部结构不熟悉,想看下我创建的表里面又多少表明,又想他按照首字母的规律排列, 这时候就要用desc +表名了. desc t_bike_info; hive> desc t_bik ...
- 创建第一个spirngmvc小项目
题外: 设置目录为源代码目录 1.进入:file->project structure->modules->soures 进入这个里面,选择相应的文件夹.例如src/java里的ja ...
- 第一章:Lambda表达式入门概念
要点:将行为像数据一样传递. 一.几种形式 1.没有参数,用()表示 () ->System.out.println("Hello World"); 2.有且仅有一个参数,省 ...