今天我们来看看第三套教程实例——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的定义如下:

__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不完全支持该机制。主要的问题在于没有OnId