WM_COMMAND

ops/2024/10/18 14:20:55/

WM_COMMAND 是Windows应用程序中一个非常重要的消息。它主要用于通知应用程序在用户界面对控件(如菜单项、按钮、列表框等)进行操作时发生的事件。处理这个消息是响应用户输入的重要途径之一。

WM_COMMAND 消息详解

当用户与窗口中的控件交互时,例如点击按钮、选择菜单项或修改编辑框内容时,系统会向包含这些控件的父窗口发送WM_COMMAND消息。WM_COMMAND消息的参数包含了足够的信息来识别哪个控件触发了消息以及具体的事件类型。

消息参数

WM_COMMAND消息有两个参数:wParamlParam

  • wParam: 由两个部分组成,高位字包含通知代码,低位字包含控件的标识符或菜单项的标识符。
  • lParam: 包含发送消息的控件的句柄。如果消息是由菜单项触发的,则为NULL

具体来说:

  • HIWORD(wParam): 通知代码,表示事件的类型(如按钮点击、编辑框内容改变等)。
  • LOWORD(wParam): 控件标识符,标识哪个控件触发了消息。
  • lParam: 控件句柄,标识哪个控件触发了消息。
常见的通知代码

通知代码是用来识别事件类型的。例如:

  • BN_CLICKED: 按钮被点击。
  • EN_CHANGE: 编辑框内容被改变。
  • LBN_SELCHANGE: 列表框选择项被改变。

示例代码

以下是一个简单的示例,演示如何在窗口过程中处理WM_COMMAND消息,以响应按钮点击事件。

1. 定义资源

首先,我们需要定义一个按钮控件。假设我们在资源脚本文件(如resource.h)中定义了按钮的标识符:

#define ID_BUTTON1 1001
2. 创建控件

在窗口创建过程中,我们创建一个按钮控件:

HWND hwndButton = CreateWindow("BUTTON",           // 控件类型"Click Me",         // 按钮文本WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // 控件样式50, 50, 100, 30,    // 控件位置和大小hwnd,               // 父窗口句柄(HMENU)ID_BUTTON1,  // 控件标识符(HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE),NULL);              // 不使用的参数
3. 处理WM_COMMAND消息

在窗口过程中,我们处理WM_COMMAND消息:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_COMMAND:{int wmId = LOWORD(wParam); // 获取控件标识符int wmEvent = HIWORD(wParam); // 获取通知代码// 检查是哪一个控件发送的消息if (wmId == ID_BUTTON1 && wmEvent == BN_CLICKED){// 响应按钮点击事件MessageBox(hwnd, "Button Clicked!", "Info", MB_OK);}}break;case WM_CLOSE:DestroyWindow(hwnd);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}

工作原理

  1. 创建控件

    • 使用CreateWindowCreateWindowEx函数创建一个按钮控件,并指定它的标识符为ID_BUTTON1
  2. 处理WM_COMMAND消息

    • 当按钮被点击时,系统向包含该按钮的窗口发送WM_COMMAND消息。
    • 在窗口过程函数中,接收到WM_COMMAND消息时,首先通过LOWORD(wParam)获取控件标识符。
    • 通过HIWORD(wParam)获取通知代码,判断事件类型。
    • 如果标识符和通知代码匹配,我们就知道哪个控件触发了哪个事件,并执行相应的处理逻辑。

结论

WM_COMMAND消息是Windows应用程序中处理控件事件的主要机制。通过处理这个消息,我们可以响应用户的各种输入和操作,如按钮点击、菜单选择、编辑框内容修改等。希望这个解释和示例能帮助你理解WM_COMMAND消息的工作原理和使用方法。如果还有其他问题,欢迎继续提问!


http://www.ppmy.cn/ops/47860.html

相关文章

Gavin Wood 访谈|Polkadot 从何而来,又将如何面对 AI 时代?

如果没有宏观经济,加密世界可能无法存在。或许,Satoshi Nakamoto 也永远不会写出那篇开创性的白皮书。区块链技术作为指数时代的核心之一,在宏观经济理论中占有重要地位。传统的经济增长公式是人口增长加生产率增长加债务增长。然而&#xff…

python基础实例

下一个更大的数 定义一个Solution类,用于实现next_great方法 class Solution: def next_great(self, nums1, nums2): # 初始化一个空字典answer,用于存储答案 answer {} # 初始化一个空列表stack,用于存储待比较的数字 stack [] # 遍历nu…

【云原生_K8S系列】什么是 Kubernetes Pod?用实际例子解释

Kubernetes(简称K8S)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。在Kubernetes中,Pod是最小的部署单元。理解Pod的概念对于掌握Kubernetes至关重要。本篇文章将详细解释什么是Kubernetes Pod,并…

网络安全第一课

网络设备、 交换机,路由器,网线,防火墙。 虚拟化技术分为哪两大类 交换机是组建局域网,内网的重要设备,但是交换机依赖路由器的内网外网 局域网一般称为内网 路由器两个口,一个连接内网,一…

Spark Streaming 概述及入门案例

一、介绍 1. 不同的数据处理 从数据处理的方式: 流式数据处理(Streaming)批量数据处理(Batch) 从数据处理的延迟: 实时数据处理(毫秒级别)离线数据处理(小时或天级别) 2. 简介 SparkStreaming 是一个准实时(秒或分钟级别)、微批量的数据处理框架Spa…

JVM 虚拟机

JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机,虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机有:JVM、VMwave、Virtual Box等。JVM 是一台被定制过的现实当中不存在的计算…

酒茶元宇宙 - 探索味觉与科技的融合奇迹

在追求创新和完美体验的新时代,酒茶文化也迎来了前所未有的变革——"酒茶元宇宙"。这一概念不仅重新定义了我们对于酒茶享受的理解,更为酒茶爱好者及业界人士提供了一个独特的交流平台。让我们一起探索这个将传统饮品与现代科技完美融合的全新…

python tqdm怎么安装

tqdm是一个显示循环的进度条的库。taqadum, تقدّم)在阿拉伯语中的意思是进展。tqdm可以在长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator),是一个快速、扩展性强的进度条工具库。 tqdm库的安装 在CMD窗口下输…