书籍:《Visual C++ 2017从入门到精通》的2.3.8 Win32控件编程
环境:visual studio 2022
内容:【例2.29】模拟对话框
说明:以下内容大部分来自腾讯元宝。
1. 基本概念与作用
LOWORD
和 HIWORD
是 Windows API 中用于分解 32 位参数的宏,主要用于解析 wParam
或 lParam
的高低 16 位数据。其核心功能包括:
- 数据拆分:将 32 位整数拆分为低 16 位(
LOWORD
)和高 16 位(HIWORD
),便于分别处理不同部分的信息。 - 消息解析:在 Windows 消息处理中,
wParam
和lParam
常携带复合信息,通过这两个宏可快速提取关键参数(如控件 ID、通知码、坐标等)。
2. 宏定义与实现
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
。
3. 在消息处理中的应用
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;
- LOWORD(wParam):指示鼠标键及组合键状态(如
滚动条消息(
WM_VSCROLL
/WM_HSCROLL
)- LOWORD(wParam):滚动操作类型(如
SB_THUMBTRACK
表示拖动滑块)。 - HIWORD(wParam):附加参数(如滚动步长)。
- LOWORD(wParam):滚动操作类型(如
4. 典型应用场景
控件事件处理
通过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
表示加速键)。
- 菜单消息:
5. 注意事项
- 数据范围:
LOWORD
和HIWORD
的结果均为WORD
类型(0~65535),超出范围会导致截断。 - 跨平台兼容性:这两个宏是 Windows 特有实现,移植到其他系统需自行实现类似逻辑。
- 消息类型差异:不同消息的
wParam
和lParam
含义不同,需结合具体消息类型解析。
总结
LOWORD
和 HIWORD
是 Windows 编程中解析消息参数的核心工具,通过拆分 32 位数据简化了控件交互、事件处理等场景的逻辑。开发者需根据具体消息类型,合理利用这两个宏提取关键信息,同时注意数据范围和跨平台限制。