示例代码
//代码示例片段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 是发送命令消息的子窗口句柄