
书籍:《Visual C++ 2017从入门到精通》的2.3.8 Win32控件编程
环境:visual studio 2022
内容:【例2.29】模拟对话框
说明:以下内容大部分来自腾讯元宝。
LOWORD
和
HIWORD
是 Windows API 中用于分解 32 位参数的宏,主要用于解析
wParam
或
lParam
的高低 16 位数据。其核心功能包括:
LOWORD
)和高 16 位(
HIWORD
),便于分别处理不同部分的信息。wParam
和
lParam
常携带复合信息,通过这两个宏可快速提取关键参数(如控件 ID、通知码、坐标等)。 LOWORD
宏定义:
#define LOWORD(l) ((WORD)(l))
作用:提取
l
的
低 16 位
(即右边的 16 位),结果为
WORD
类型(0~65535)。
示例:若
wParam = 0x12345678
,则
LOWORD(wParam) = 0x5678
。
HIWORD
宏定义:
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
作用:提取
l
的
高 16 位
(即左边的 16 位),结果为
WORD
类型。
示例:若
wParam = 0x12345678
,则
HIWORD(wParam) = 0x1234
。
Windows 消息(如
WM_COMMAND
、
WM_MOUSEWHEEL
等)的
wParam
和
lParam
常通过这两个宏传递复合信息,典型场景包括:
**
WM_COMMAND
消息**
LOWORD(wParam) :控件 ID(如按钮、菜单项的标识符)。
HIWORD(wParam)
:通知码(标识具体事件类型,如按钮点击
BN_CLICKED
)。
示例 :
case WM_COMMAND:
if (LOWORD(wParam) == IDOK) { // 按钮 ID 为 IDOK
if (HIWORD(wParam) == BN_CLICKED) { // 通知码为点击事件
// 处理确定按钮点击
}
}
break;
**
WM_MOUSEWHEEL
消息**
LOWORD(wParam)
:指示鼠标键及组合键状态(如
MK_CONTROL
)。
HIWORD(wParam) :滚轮滚动量(120 表示向上滚动一行)。
示例 :
case WM_MOUSEWHEEL:
int zDelta = HIWORD(wParam); // 获取滚动量
if (LOWORD(wParam) & MK_CONTROL) { // 检测是否按住 Ctrl 键
// 按住 Ctrl 时的特殊处理
}
break;
滚动条消息(
WM_VSCROLL
/
WM_HSCROLL
)
SB_THUMBTRACK
表示拖动滑块)。 控件事件处理
通过
LOWORD
和
HIWORD
快速定位控件 ID 和事件类型,避免手动位运算。
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED) {
switch (LOWORD(wParam)) {
case IDC_BUTTON1: // 处理按钮1点击
break;
case IDC_BUTTON2: // 处理按钮2点击
break;
}
}
break;
坐标解析
在鼠标消息(如
WM_LBUTTONDOWN
)中,
lParam
包含坐标信息,需通过
LOWORD
和
HIWORD
分离:
case WM_LBUTTONDOWN:
int x = LOWORD(lParam); // 客户区 X 坐标
int y = HIWORD(lParam); // 客户区 Y 坐标
break;
菜单与加速键
LOWORD(wParam)
为菜单项 ID,
HIWORD
为选择标识。LOWORD(wParam)
为加速键 ID,
HIWORD
为标志(如
1
表示加速键)。LOWORD
和
HIWORD
的结果均为
WORD
类型(0~65535),超出范围会导致截断。wParam
和
lParam
含义不同,需结合具体消息类型解析。 总结
LOWORD
和
HIWORD
是 Windows 编程中解析消息参数的核心工具,通过拆分 32 位数据简化了控件交互、事件处理等场景的逻辑。开发者需根据具体消息类型,合理利用这两个宏提取关键信息,同时注意数据范围和跨平台限制。
