WM_COMMAND

2024-06-07 23:20
文章标签 command wm

本文主要是介绍WM_COMMAND,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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消息的工作原理和使用方法。如果还有其他问题,欢迎继续提问!

这篇关于WM_COMMAND的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040586

相关文章

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

编译时出现错误 -- clang: error: linker command failed with exit code 1 (use -v to see invocation)

出现这个错误的原因有多种,常见的是因为某些文件的缺失或者是文件的重复导致的。 这类错误查看的关键在于其上一行的文字。 对于文件缺少而导致错误的情况: 例如上图中的示例,其上一行文字为 ld:library not found for -lrxl,可以看出是缺失了某一文件而导致的错误,这行文字中的最后“ -lrxl ”:-l 代表着其前缀是“lib”,连着后面的 rxl,其名称为 libr

ON_COMMAND_RANGE 和 ON_UPDATE_COMMAND_UI_RANGE

 ON_COMMAND_RANGE 和 ON_UPDATE_COMMAND_UI_RANGE 可以影射ID连续的Toolbar/Menu ID。 ON_COMMAND_RANGE影射的消息响应函数需要一个参数UINT表明是哪一个消息, afx_msg void OnZoom(UINT nID); 而ON_UPDATE_COMMAND_UI_RANGE的消息响应函数则无此ID,与ON

on command range

 ON_COMMAND_RANGEON_COMMAND_RANGE( id1, id2, memberFxn )参数: id1一个连续范围的命令ID的起始值。id2一个连续范围的命令ID的结束值。memberFxn该命令被映射到的消息处理函数的名字。 说明:使用这个宏把一个连续范围的命令ID映射到单个命令处理函数。ID的范围从id1开始,到id2结束。用ON_COMMAND_RAN

ON_COMMAND_RANGE的用法

 今天主要介绍一下ON_COMMAND_RANGE的用法 第一次用这个方法还是刚毕业那会,那时写过一个控制程序,界面上有很多电器的控制按钮,这些按钮的响应函数基本一致,只是相应的ID值不一样,要是一一写响应函数那不累死人,于是就东找西找,找到ON_COMMAND_RANGE。 最近一个偶然机会也要用到它,三下五除二,CODE写完了, 1.在要添加的工程上添加函数afx_msg vo

seleniumIDE command 命令类型

command命令 三大类型:(action、Accessor、assertion) 操作 存储 断言 操作类型——Action 浏览器操作 open(https://www.sogou.com/) 打开url。 goBack() 无参数,后退。 refresh() 无参数,刷新。 windowFocus() 无参数,激活选中的浏览器窗口。 windowMaximize() 无参数,使浏览器窗口

【POJ】3164 Command Network 最小树形图——朱刘算法

传送门:【POJ】3164 Command Network 题目大意:平面上n个点,分别编号1~n。有m条有向边(u,v),边权为两点间的笛卡尔距离,表达为(u,v,cost)。现在问你能否选择一些边使得编号为1的点能到达其他所有点并且花费最小。 题目分析:最小树形图入门题。 什么是最小树形图?其实就是有向最小生成树。 那么算法是怎么实现的呢? 首先,我们从根做一次dfs,判

python执行command, 并获取command的执行结果

import subprocess   # 方法1:使用subprocess模块的run函数 def run_cmd_1(command):     """     运行CMD命令并返回输出结果          参数:     command (str): 要执行的CMD命令          返回:     output (str): 命令执行的输出结果     """     try:

Unknown command: “create-react-app“

在创建react项目时出现报错" Unknown command: "create-react-app" " 解决方法: 配置变量,在要创建的目录下打开控制栏,输入下列命令,回车等待结束即可: npx create-react-app 项目名称   可能遇见的错误: 1. npm error network 'proxy' config is set properly.  S