最近接手了一个Win32软件项目,其中涉及到大量消息的响应,通篇都是这样的代码
switch (msg)
{
case WM_CREATE:
//code A
break;
case WM_COMMAND:
//code B
break;
//case ...
//case ....
case WM_EXIT:
//code N
break;
default:
break;
}
每种消息响应都离不开wParam和lParam两个参数,而对于不同的系统消息,两个参数的意义完全不同。对于不熟悉消息内容的人,这样的代码很难阅读和维护,而且复杂的switch-case结构看起来也很难受。幸运的是,windows已经通过宏定义HANDLE_MSG将消息和消息响应函数对应了起来。HANDLE_MSG使开发者只需要如何关心处理消息,不再需要不停的查MSDN啦。HANDLE_MSG是在windowsx.h中定义的:
#define HANDLE_MSG(hwnd, message, fn) \
case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))
宏的三个参数分别为窗口句柄hwnd、消息message和响应函数fn。HANDLE_##message也是预定义宏,功能是从wParam和lParam中提取参数列表。但有一件事仍是开发者自己要做的,即定义根据消息的参数列表定义响应函数,只需按照windowsx.h中相应HANDLE_##message复制粘贴即可。
使用宏简化后的代码如下:
HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
//...
//...
HANDLE_MSG(hwnd, WM_EXIT, OnExit);
网友评论