消息分流器

消息分流器定义在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核心编程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值