用HANDLE_MSG让代码更清晰

最近接手了一个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);

参考文献

[1].使用HANDLE_MSG宏简化Win32应用的开发

你可能感兴趣的:(用HANDLE_MSG让代码更清晰)