Windows核心编程之消息分流

本文详细解析了消息分流机制,以WM_COMMAND为例,解释了wParam和lParam的作用,以及如何通过HAND_MSG和HAND_WM_COMMAND宏进行控件处理。重点介绍了应用窗口的回调函数实现,包括初始化对话框和响应命令消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

下面我以 WM_COMMAND为例分析消息的分流

1. 我们知道,每个消息都有 wParam 和 lParam,WM_COMMAND,wParam包含两个不同的值,其中:

 wParam:低字节是控件的id,高字节是通知码 notifyCode

 lParam: 强制转换为按钮或控件的句柄值 hWndCtl

2. HAND_MSG宏定义,第五版是chHANDLE_DLGMSG (windowsx.h) 

// The normal HANDLE_MSG macro in WindowsX.h does not work properly for dialog

// boxes because DlgProc returns a BOOL instead of an LRESULT (like

// WndProcs). This chHANDLE_DLGMSG macro corrects the problem:

#define chHANDLE_DLGMSG(hWnd, message, fn)                 \

   case (message): return (SetDlgMsgResult(hWnd, uMsg,     \

      HANDLE_##message((hWnd), (wParam), (lParam), (fn))))

#define HANDLE_MSG(hwnd,message,fn) \

 case (message): \

   Return HANDLE_##message((hwnd),(wParam),(lParam),(fn))

3. 如遇到 WM_COMMAND,则语句扩展成

case (WM_COMMAND):

  return (SetDlgMsgResult(hWnd, uMsg,     \

    HANDLE_WM_COMMAND((hWnd), (wParam), (lParam), (Dlg_OnCommand))

4. 这里,你可以看一下HAND_WM_COMMAND宏的扩展 (windowsx.h)

#define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn)  \

  ((fn) ((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),

    (UINT)HIWORD(wParam)),0L)

5. 应用窗口的回调函数定义

INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {   

   switch (uMsg) {

      chHANDLE_DLGMSG(hWnd, WM_INITDIALOG, Dlg_OnInitDialog);

      chHANDLE_DLGMSG(hWnd, WM_COMMAND,    Dlg_OnCommand);

   }

   return(FALSE);

}

6. 应用窗口的回调函数实现

void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) 

{

   switch (id) 

   {

      case IDCANCEL:

         EndDialog(hWnd, id);

         break;

      case IDC_BTN_STOP: 

      {

         // StopProcessing can't be called from the UI thread

         // or a deadlock will occur: SendMessage() is used 

         // to fill up the listboxes

         // --> Another thread is required

         DWORD dwThreadID;

         CloseHandle(chBEGINTHREADEX(NULL, 0, StoppingThread, NULL, 0, &dwThreadID));         

         // This button can't be pushed twice,这个控件的句柄

         Button_Enable(hWndCtl, FALSE);

      }

      break;

   }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值