WinX教程之我的实战(三)
今天我们来看看第三套教程实例——step003-command。WinX是越来越有意思了,通过这套实例,我们就已经可以处理命令消息。
命令消息
如果你用过MFC,那么你一定知道什么叫命令消息。说的通俗点,命令消息就是和控件、菜单相关的消息,一般命令消息都会和一个ID相关,即控件ID或者菜单的一个条目的ID,也由ID区分不同的命令消息。
实例中用到的命令消息处理宏
在实例CmdDisp中用到了:
l WINX_CMDS_BEGIN
l WINX_CMD
l WINX_CMDS_END
用法是在类定义中,如这样写:
WINX_CMD(IDC_TODO, OnCmdTodo);
WINX_CMD(ID_HELP_ABOUT, OnCmdAbout);
WINX_CMDS_END();
宏WINX_CMD带有两个参数,前一个是控件ID,后一个是拦截此命令消息的函数。当该控件被单击时,就调用后一个函数。
我们在定义消息处理函数名前用到了winx_msg宏,winx_msg宏的定义如下:
宏winx_call的定义如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
__fastcall是另一种不同于__cdecl和__stdcall的函数调用规范,它速度快,使用寄存器来传递参数。要知道详细信息,可以网上搜索。不过我们不用关心它,我们只要在定义消息处理函数名前加上winx_msg宏就可以了。(注:WinX并不依赖于__fastcall,意思就是说,不写调用方式也可以)
在实例CmdState中用到了:
l WINX_CMDS_BEGIN
l WINX_CMD
l WINX_CMDS_END
l WINX_UPDATEUI_BEGIN
l WINX_UPDATEUI
l WINX_UPDATEUI_END
比第一个实例多了后面三个宏。用法就是在类定义中,如下这样写:
WINX_UPDATEUI(IDC_ALL, UPDUI_MENUPOPUP)
WINX_UPDATEUI_END();
引自WinX附带文件WinxPreview.ppt:
l “WTL的命令状态维护机制不错,但是ModalDialog不完全支持该机制。主要的问题在于没有OnIdle消息。”
l “WINX的UpdateUI基于WTL的命令状态维护机制实现,并作出改进。”
这一套消息用来维护命令状态,比如菜单某个条目状态(比如enable状态)改变了,可以自动更新。宏WINX_UPDATEUI带有两个参数,前一个是要维护命令状态的控件ID,后一个是界面元素类型。比如实例CmdState中,我们要更新的是菜单中的命令状态,那后一个参数就应该是UPDUI_MENUPOPUP。
下面中列出了另外一些你可能会用到的界面元素类型:
界面元素类型 |
描述 |
UPDUI_MENUPOPUP, |
菜单 |
UPDUI_MENUBAR |
菜单条 |
UPDUI_CHILDWINDOW |
子窗口 |
UPDUI_TOOLBAR |
工具条 |
UPDUI_STATUSBAR |
状态条 |
除此外,下面列出了一些命令状态及其设置/清楚状态的函数名:
状态 |
描述 |
设置/清楚函数 |
UPDUI_ENABLED |
激活 |
UIEnable |
UPDUI_DISABLED |
反激活 |
|
UPDUI_CHECKED |
复选框 |
UISetCheck |
UPDUI_CHECKED2 |
有三种状态 |
|
UPDUI_RADIO |
单选框 |
UISetRadio |
UPDUI_TEXT |
文本 |
UISetText |
UPDUI_DEFAULT |
默认按钮(对话框) |
UISetDefault |
UIEnable原型如下:
UISetCheck原型如下:
BOOL UISetCheck(int nID, bool bCheck, BOOL bForceUpdate = FALSE);
前一个用于具有第三种状态(UPDUI_CHECKED2)的复选框,这时要求CheckBox要候BS_3STATE或BS_AUTO3STATE。
UISetRadio原型如下:
UISetText原型如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
UISetDefault原型如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
其他WinX命令消息处理宏
WINX_CMDS_BEGIN_EX
WINX_CMD_EX
WINX_CMDS_END_EX
与WINX_CMDS_BEGIN/END的区别是,如果消息自身没有处理,会发给活动的子视图处理。
其他问题
在实例CmdState中,还有三个地方需要提一下:
1、
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
当我们需要进行命令状态维护时,我们的类(窗口,对话框),需要添加另一个基类winx::UpdateUI<CHelloDlg>。
2、
{
winx::PopupMenu(hWnd, pos.x, pos.y, IDR_MAINMENU);
return TRUE;
}
在实战一中我们已经介绍过拦截系统消息时,只需定义相应函数就可以,不用写消息拦截代码。这里OnContextMenu就是处理系统消息WM_CONTEXTMENU的函数,即当右键单击对话框时。这里的操作是调用WinX内置函数PopupMenu,指定相应菜单资源ID,弹出菜单。
3、
dlg.DoModal(hWnd, IDD_ABOUT);
当我们只是需要一个简单对话框,即我们不需要拦截任何消息,只需要将相应的控件放好(资源文件,对话框设计器),直接像这里调用DoModal就可以了。一个区别是,这里的对话框资源ID是在DoModal函数中指定的,而非自己定义对话框时在模板参数中指定。
我们不妨实战一下
我们做一个简单的例子,利用一下我们学习前几个教程实例的成果。
功能:
1、 设定背景色为白色;
2、 设定窗口上所有控件背景色为透明;
3、 具有菜单和命令状态维护功能,用Check;
4、 弹出右键菜单。
假设我们的项目名为Example3。
步骤一:打开VC 6.0 英文版,:p;
步骤二:利用Wizard创建Win32 Application,选择“A Simple Win32 Application”;
步骤三:添加资源文件,如下图,
步骤四:添加对话框,Insert即可,如下图:
(请高手们保持耐心,:))
之后选择对话框类别,New即可,生成对话框资源后,将对话框资源ID修改为IDD_MYEXAMPLE3。其他按钮控件我们一会再加。
步骤五:定义主窗口类(直接在主程序文件Example3.cpp定义中即可),我们的主窗口类是一个模式对话框,而且我们要做命令状态维护,所以别忘了要多加一个基类winx::UpdateUI,如下,
public winx::ModalDialog< CMyExample3Dlg, IDD_MYEXAMPLE3>,
public winx::UpdateUI< CMyExample3Dlg >
{
};
这里的IDD_MYEXAMPLE3就是我们刚才创建的对话框的资源ID。
步骤六:添加其他资源,如菜单、按钮、静态文本框等,结果如下,
步骤七:添加代码。
将窗口背景设置为白色,代码为:
WINX_BKGND_BRUSH(WHITE_BRUSH);
将窗口上所有控件的背景设置为透明,代码为:
WINX_CTLBKGND_NULL_ALL();
设置右键菜单,代码为:
{
winx::PopupMenu(hWnd, pos.x, pos.y, IDR_MENU1_);
return TRUE;
}
拦截命令消息,并维护命令状态,代码如下:
WINX_CMD(IDM_ABOUTAPP, OnAboutApp);
WINX_CMD(IDM_ITEM1, OnItem1);
WINX_CMD(IDM_ITEM2, OnItem2);
WINX_CMD(IDM_UNCHECKALL, OnUnCheckAll);
WINX_CMDS_END();
WINX_UPDATEUI_BEGIN()
WINX_UPDATEUI(IDM_ITEM1, UPDUI_MENUPOPUP)
WINX_UPDATEUI(IDM_ITEM2, UPDUI_MENUPOPUP)
WINX_UPDATEUI_END();
public:
VOID OnAboutApp(HWND hWnd)
{
winx::SimpleDialog dlg;
dlg.DoModal(hWnd, IDD_ABOUTAPP);
}
VOID OnItem1(HWND hWnd)
{
UISetCheck(IDM_ITEM1, TRUE);
}
VOID OnItem2(HWND hWnd)
{
UISetCheck (IDM_ITEM2, TRUE);
}
VOID OnUnCheckAll(HWND hWnd)
{
UISetCheck (IDM_ITEM1, FALSE);
UISetCheck (IDM_ITEM2, FALSE);
}
步骤八:添加主程序代码,如下:
dlg.DoModal();
运行结果:
注意:1、不知大家注意没有,每个WINX_CMDS_xx宏后面都有分号,而并非每个WINX_UPDATEUI_xx宏有,只有最后一个WINX_UPDATEUI_END();有。2、对话框的主菜通过在资源中直接设定。
不知大家在上面运行结果图中发现什么问题没有?有奖问答!J
源代码下载
END
关于上面提到的分号“;”问题,咨询xushiwei后补充如下:
winx旧的习惯是所有的宏后加上;(如上面的WINX_CMD),而wtl的习惯是不带;(如上面的WINX_UPDATEUI是依赖wtl实现的), 这就就出现了不一致的情况。目前winx没有消除这种不一致。考虑到可能给用户造成困惑,winx决定在下一个release全部统一为不带;号。不过我们会兼容目前的文法,也就是说,winx的宏允许带不带;均可。
END AGAIN
WinX教程之我的实战(三)相关推荐
- Docker最全教程——从理论到实战(三)
容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本篇教程持续编写了2个星期左右,只是为了大家更好地了解.理解和消化这个技术,能够搭上这波车. 你 ...
- Docker最全教程——从理论到实战(六)
Docker最全教程--从理论到实战(六) 原文:Docker最全教程--从理论到实战(六) 托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号"magiccodes"已经发 ...
- Docker最全教程——从理论到实战(一)
Docker最全教程--从理论到实战(一) 目录 前言 随着生产力的发展尤其是弹性架构的广泛应用(比如微服务),许多一流开发者都将应用托管到了应用容器上,比如Google.微软.亚马逊.腾讯.阿里.京 ...
- 里面使用轮播_小程序ColorUI框架初步使用教程及个人项目实战
小程序ColorUI框架初步使用教程及个人项目实战 最近在写自己的一个微信小程序项目<阿涛技术博客>,目前还在写前端小程序部分,之前我有用过小Weiui,Linui等微信小程序UI框架,在 ...
- 【Qt】数据库实战(三)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 增删改查操作 04. 名字绑定和位置绑定 05. 程序示例 06. 批处理操作 07. 事务操作 08. 附录 01. 概 ...
- Docker最全教程——从理论到实战(七)
Docker最全教程--从理论到实战(七) 原文:Docker最全教程--从理论到实战(七) 在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解 ...
- Docker最全教程——从理论到实战(九)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- Docker最全教程——从理论到实战(八)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- Docker最全教程——从理论到实战(五)
在笔者参加腾讯容器服务技术交流会时,我们了解到了藏区牧民的目前的生活艰辛状况,因此除了在同事朋友之间推荐其土特产之外,我们也在此进行初步分享,希望略尽绵薄之力,能够帮助到他们: 货真价实.确保都是37 ...
最新文章
- Struts2基础(1)_MVC
- 浅析网站建设之初应该从哪些方面进行考虑?
- vim在每行行首或行尾添加/删除内容
- SAP CRM Fiori 应用 my Opportunities 的后台性能分析
- 每日一小练——按字典顺序列出全部子集
- mysql储存过程把集合并_MySQL 多日志表结果集合拼接存储过程
- mini2440-Openwrt启动信息
- linux上安装shell编辑器与linux运维面试题
- 综合评价模型的缺点_【必备】目标检测中的评价指标有哪些?
- jQuery实现点击行(tr)选中某列中CheckBox
- 常用の工具(update 22.11.11)
- 交换两个数组的内容555555555
- Mstar 方案白板书写加速
- App自动化测试介绍和环境搭建
- Matlab公网通信的实现(NAT123实现内网穿透)
- 我为什么要选择traefik2做网关?
- 进阶版Shell脚本合集
- 廖雪峰Python教程笔记(一)
- 数据可视化-----标签云的实现
- 国产的蓝光存储设备能算信创产品吗?
热门文章
- 模拟进程创建、终止、阻塞、唤醒原语_轻松搞定进程原理
- DeltaPQ: Lossless Product Quantization Code Compression for High Dimensional Similarity Search
- 台式计算机常用哪些主板结构,一种台式计算机用主板的制作方法
- 服装扣件行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 计算机考研分数403,总分403分过来人分享成功考研经验_跨考网
- 看完之后终于明白了,要用5G网络必须要换成5G手机吗?
- error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义
- 医疗人工智能发展趋势及机遇
- 微电子电路——期末总结
- 打造XP系统万能克隆-Ghost全攻略