目录

LOWORDwParam-与-HIWORDwParam-详解

LOWORD(wParam) 与 HIWORD(wParam) 详解

书籍:《Visual C++ 2017从入门到精通》的2.3.8 Win32控件编程

环境:visual studio 2022

内容:【例2.29】模拟对话框

说明:以下内容大部分来自腾讯元宝。

1. 基本概念与作用

LOWORDHIWORD 是 Windows API 中用于分解 32 位参数的宏,主要用于解析 wParamlParam 的高低 16 位数据。其核心功能包括:

  • 数据拆分 :将 32 位整数拆分为低 16 位( LOWORD )和高 16 位( HIWORD ),便于分别处理不同部分的信息。
  • 消息解析 :在 Windows 消息处理中, wParamlParam 常携带复合信息,通过这两个宏可快速提取关键参数(如控件 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_COMMANDWM_MOUSEWHEEL 等)的 wParamlParam 常通过这两个宏传递复合信息,典型场景包括:

  1. ​** WM_COMMAND 消息**

    • LOWORD(wParam) :控件 ID(如按钮、菜单项的标识符)。

    • HIWORD(wParam) :通知码(标识具体事件类型,如按钮点击 BN_CLICKED )。

      示例

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK) { // 按钮 ID 为 IDOK
            if (HIWORD(wParam) == BN_CLICKED) { // 通知码为点击事件
                // 处理确定按钮点击
            }
        }
        break;
  2. ​** WM_MOUSEWHEEL 消息**

    • LOWORD(wParam) :指示鼠标键及组合键状态(如 MK_CONTROL )。

    • HIWORD(wParam) :滚轮滚动量(120 表示向上滚动一行)。

      示例

    case WM_MOUSEWHEEL:
        int zDelta = HIWORD(wParam); // 获取滚动量
        if (LOWORD(wParam) & MK_CONTROL) { // 检测是否按住 Ctrl 键
            // 按住 Ctrl 时的特殊处理
        }
        break;
  3. 滚动条消息( WM_VSCROLL / WM_HSCROLL )​

    • LOWORD(wParam) :滚动操作类型(如 SB_THUMBTRACK 表示拖动滑块)。
    • HIWORD(wParam) :附加参数(如滚动步长)。

4. 典型应用场景

  1. 控件事件处理

    通过 LOWORDHIWORD 快速定位控件 ID 和事件类型,避免手动位运算。

    case WM_COMMAND:
        if (HIWORD(wParam) == BN_CLICKED) {
            switch (LOWORD(wParam)) {
                case IDC_BUTTON1: // 处理按钮1点击
                    break;
                case IDC_BUTTON2: // 处理按钮2点击
                    break;
            }
        }
        break;
  2. 坐标解析

    在鼠标消息(如 WM_LBUTTONDOWN )中, lParam 包含坐标信息,需通过 LOWORDHIWORD 分离:

    case WM_LBUTTONDOWN:
        int x = LOWORD(lParam); // 客户区 X 坐标
        int y = HIWORD(lParam); // 客户区 Y 坐标
        break;
  3. 菜单与加速键

    • 菜单消息LOWORD(wParam) 为菜单项 ID, HIWORD 为选择标识。
    • 加速键LOWORD(wParam) 为加速键 ID, HIWORD 为标志(如 1 表示加速键)。

5. 注意事项

  • 数据范围LOWORDHIWORD 的结果均为 WORD 类型(0~65535),超出范围会导致截断。
  • 跨平台兼容性 :这两个宏是 Windows 特有实现,移植到其他系统需自行实现类似逻辑。
  • 消息类型差异 :不同消息的 wParamlParam 含义不同,需结合具体消息类型解析。

总结

LOWORDHIWORD 是 Windows 编程中解析消息参数的核心工具,通过拆分 32 位数据简化了控件交互、事件处理等场景的逻辑。开发者需根据具体消息类型,合理利用这两个宏提取关键信息,同时注意数据范围和跨平台限制。