消息分流器定义在MicrosoftVisual C++中提供的Wi n d o w s X . h文件里。通常在Wi n d o w s . h文件之后紧接着包含这个文件。Wi n d o w s X . h文件就是一组# d e f i n e指令,建立了一组供我们使用的宏。Wi n d o w s X . h的宏实际上分为三组:消息分流器、子控件宏和A P I宏。
这里只关注消息分流器,它使窗口过程的编写更加容易。通常,窗口过程是用一个大的s w i t c h语句实现的,有的窗口过程的s w i t c h语句包含5百多行代码。我们都知道按这种方式实现窗口过程是一种坏的习惯,但我们都这么做过。而利用消息分流器可将s w i t c h语句分成小的函数,每个窗口消息对应一个函数。这样使代码更容易管理。
·未使用消息分流器:
void Cls_OnCommand(HWND hwnd, intid, HWND hwndCtl,
UINT codeNotify)
{
switch(id)
{
case ID_SOMELISTBOX:
if(codeNotify != LBN_SELCHANGE)
break;
// Do LBN_SELCHANGE processing.
break;
case ID_SOMEBUTTON:
break;
}
}
·使用消息分流器:
LRESULT WndProc(HWND hwnd, UINTuMsg,
WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hwnd, WM_COMMAND,Cls_OnCommand);
HANDLE_MSG(hwnd, WM_PAINT, Cls_OnPaint);
HANDLE_MSG(hwnd, WM_DESTROY,Cls_OnDestroy);
default:
return(DefWindowProc(hwnd, uMsg,wParam, lParam));
}
}
H A N D L E _ M S G宏在Wi n d o w s X . h中是这样定义的:
#define HANDLE_MSG(hwnd, message,fn) \
case(message): \
return HANDLE_##message((hwnd), (wParam),(lParam), (fn));
对于W M _ C O M M A N D消息,预处理程序把这一行代码扩展成下面的代码:
case(WM_COMMAND):
return HANDLE_WM_COMMAND((hwnd),(wParam), (lParam),
(Cls_OnCommand));
定义在WindowsX.h 中的各H A N D L E _ W M _ *宏是实际的消息分流器。它们分流w P a r a m参数和l P a r a m参数,执行所有必要的转换,并调用适当的消息函数,如前面例举过的C l s _O n C o m m a n d函数。H A N D L E _ W M _ C O M M A N D宏的定义如下:
#define HANDLE_WM_COMMAND(hwnd,wParam, lParam, fn) \
( (fn) ((hwnd), (int) (LOWORD(wParam)), (HWND)(lParam),
(UINT) HIWORD(wParam)), 0L)
当预处理程序扩展这个宏时,其结果是用w P a r a m和l P a r a m参数的内容分流成各自的部分并经适当转换,来调用C l s _ O n C o m m a n d函数。
以上是微软采用宏实现的消息分流器机制,如果需要定制自己的消息分流器,可根据这个头文件中的宏,很容易编写自己的宏。
参考资料:《Windows核心编程》