利用winx的command宏处理按钮事件
目的
利用winx的便利性进行按钮事件处理
原理介绍
Winx提供了以下几个宏来处理菜单,控件等的命令消息
WINX_CMDS_BEGIN
WINX_CMD
WINX_CMDS_END
用法
在窗口类定义中,如这样写:
WINX_CMDS_BEGIN();
WINX_CMD(IDC_TODO, OnCmdTodo);
WINX_CMD(ID_HELP_ABOUT, OnCmdAbout);
WINX_CMDS_END();
宏WINX_CMD带有两个参数,前一个是控件ID,后一个是处理此命令消息的函数。当该控件被单击时,就调用这个消息处理函数。
我们在定义消息处理函数名前用到了winx_msg宏,winx_msg宏的定义如下:
#define winx_msg winx_call
宏winx_call的定义如下:
#define winx_call __fastcall
__fastcall是另一种不同于__cdecl和__stdcall的函数调用规范,它速度快,使用寄存器来传递参数。要知道详细信息,可以网上搜索。不过我们不用关心它,我们只要在定义消息处理函数名前加上winx_msg宏就可以了。(注:WinX并不依赖于__fastcall,意思就是说,不写调用方式也可以)
上面部分引用:http://blog.youkuaiyun.com/ken0426/archive/2006/11/28/1419023.aspx
步骤
注释掉我们自己写的OnCommand函数
新增下列代码
WINX_CMDS_BEGIN()
WINX_CMD(IDC_BUTTON1, OnCmdButton1)
WINX_CMDS_END()
void OnCmdButton1(HWND hWnd)
{
MessageBox( _T("yes") );
}
结果
编译运行正常。
分析
这些宏起到了什么作用?背后的机理是什么?其实很简单,看看宏的实现是什么就真相大白了。
#define WINX_CMDS_BEGIN() /
public: /
BOOL winx_msg OnCommand( /
HWND hWnd, WPARAM wParam, HWND hWndCtlFrom) /
{
BEGIN仅仅是对函数定义的替换而已。还是实现了OnCommand函数。
#define WINX_CMD(nID, Function) /
if (LOWORD(wParam) == (nID)) { /
Function(hWnd); return TRUE; /
}
CMD也仅仅是对比下ID后调用处理函数而已。
#define WINX_CMDS_END() /
return BaseClass::OnCommand(hWnd, wParam, hWndCtlFrom); /
}
END呢,也仅仅是调用了基类的OnCommand来处理一些默认的事件。并将函数闭合而已。
哈哈,实在是太明白不过了。
获取编辑框内容
目的
在对话框上增加编辑框,并通过程序获得用户输入的文字
思考
一般得到空间文字,是通过GetDlgItemText函数完成的,该函数原型为:
UINT GetDlgItemText( HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount );
显然,可以在按钮事件里处理了。
我在试验的时候,发现GetDlgItemText已经被winx给包装好了。嗯,其实前面例子中的Messagebox也是包装过的。
另外,字符串类,也直接使用了WTL::CString了。
步骤
在资源编辑界面,往对话框上托一个编辑框IDC_EDIT_SRC
在按钮事件处理函数中,修改代码为:
void OnCmdButton1(HWND hWnd)
{
winx::CString strText= GetDlgItemText( IDC_EDIT_SRC);
MessageBox( strText );
}
编译ok。
举一反三
编辑框内容获取有Get,设置内容自然有Set了。SDK的Set函数为:
BOOL SetDlgItemText( HWND hDlg, int nIDDlgItem, LPCTSTR lpString );
我猜测,winx应该包装了它,肯定有一个函数是:
SetDlgItemText(ID,CString);
嗯,我试验了下,我错了。请自行试验。
奢望
通过Set/GetDlgItemText的方式虽然能得到控件内容,可是MFC用DDX的方式,方便不了少,winx有无此考虑呢?
答案是肯定的。