LOWORDwParam-与-HIWORDwParam-详解
LOWORD(wParam) 与 HIWORD(wParam) 详解
书籍:《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;
滚动条消息(
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 位数据简化了控件交互、事件处理等场景的逻辑。开发者需根据具体消息类型,合理利用这两个宏提取关键信息,同时注意数据范围和跨平台限制。