最近接手了一個(gè)Win32軟件項(xiàng)目,其中涉及到大量消息的響應(yīng),通篇都是這樣的代碼
switch (msg)
{
case WM_CREATE:
//code A
break;
case WM_COMMAND:
//code B
break;
//case ...
//case ....
case WM_EXIT:
//code N
break;
default:
break;
}
每種消息響應(yīng)都離不開wParam和lParam兩個(gè)參數(shù),而對(duì)于不同的系統(tǒng)消息,兩個(gè)參數(shù)的意義完全不同。對(duì)于不熟悉消息內(nèi)容的人,這樣的代碼很難閱讀和維護(hù),而且復(fù)雜的switch-case結(jié)構(gòu)看起來(lái)也很難受。幸運(yùn)的是,windows已經(jīng)通過宏定義HANDLE_MSG將消息和消息響應(yīng)函數(shù)對(duì)應(yīng)了起來(lái)。HANDLE_MSG使開發(fā)者只需要如何關(guān)心處理消息,不再需要不停的查MSDN啦。HANDLE_MSG是在windowsx.h中定義的:
#define HANDLE_MSG(hwnd, message, fn) \
case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))
宏的三個(gè)參數(shù)分別為窗口句柄hwnd、消息message和響應(yīng)函數(shù)fn。HANDLE_##message也是預(yù)定義宏,功能是從wParam和lParam中提取參數(shù)列表。但有一件事仍是開發(fā)者自己要做的,即定義根據(jù)消息的參數(shù)列表定義響應(yīng)函數(shù),只需按照windowsx.h中相應(yīng)HANDLE_##message復(fù)制粘貼即可。
使用宏簡(jiǎn)化后的代碼如下:
HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
//...
//...
HANDLE_MSG(hwnd, WM_EXIT, OnExit);