1.1 Windows核心编程-几个宏的解读

示例代码

//代码示例片段1
DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);

//代码示例片段2
switch (uMsg) {
      chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
      chHANDLE_DLGMSG(hwnd, WM_COMMAND,    Dlg_OnCommand);
   case ESM_POKECODEANDLOOKUP:
      SetDlgItemInt(hwnd, IDC_ERRORCODE, (UINT) wParam, FALSE);
      FORWARD_WM_COMMAND(hwnd, IDOK, GetDlgItem(hwnd, IDOK), BN_CLICKED,
         PostMessage);
      SetForegroundWindow(hwnd);
      break;
   }
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);

宏展开:

#define MAKELANGID(p,s)      ((((WORD)(S)) << 10) | (WORD)(p))
//转换成系统默认的语言
chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog)
// 展开
#define chHANDLE_DLGMSG(hWnd, message, fn)  \
    case (message): return (SetDlgMsgResult(hWnd, uMsg,   \
        HANDLE_##message((hWnd), (wParam), (lParam), (fn))))
/*
 宏在程序编译的时候会展开,所以这个宏会直接展开成一个 case 语句,该宏放在 switch语句中

## 符号是拼接符,如message消息是 WM_COMMAND,则HANDLE_##message展开为:
HANDLE_WM_COMMAND.
*/

SetDlgMsgResult(
    HWND    hwnd,     // Handle to the dialog box
    int     msg,      // Specifies the zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus four.
    LONG    result    // Specifies the replacement value.
    )
// 将对应窗口的特定消息交由指定的消息处理函数处理
HANDLE_WM_COMMAND
宏展开语句为:
#define HANDLE_WM_COMMAND(hwnd, wParam, lParam, fn) \
    ((fn)((hwnd), (int)(LOWORD(wParam)), (HWND)(lParam), (UINT)HIWORD(wParam)), 0L)

在消息处理函数中,wParam的低16位是消息命令ID, 高16位是对应的通知码,lParam 是发送命令消息的子窗口句柄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值