MFC的控件无法触发事件函数(ON_COMMAND_RANGE的映射范围冲突)

如果你在MFC中使用ON_COMMAND_RANGE为多个控件绑定了同一个函数,如果使用不当,可能会造成某些控件无法映射或错误映射到对应的事件函数

错误原因:

如下图,假设为所使用的两个ON_COMMAND_RANGE和一个ON_BN_CLICKED,从IDC_BUTTON1到IDC_BUTTON5的ID值依次为1001,1002,1003,1004,1005

c 复制代码
BEGIN_MESSAGE_MAP(Dialog_DIA, CDialogEx)

ON_COMMAND_RANGE(IDC_BUTTON1, IDC_BUTTON5, &CUT3MF_DIA::OnBnClickedButton1)
ON_COMMAND_RANGE(IDC_BUTTON3, IDC_BUTTON4, &CUT3MF_DIA::OnBnClickedButton2)

ON_BN_CLICKED(IDC_BUTTON5, &CUT3MF_DIA::OnBnClickedButton3)

END_MESSAGE_MAP()

ON_COMMAND_RANGE所映射的控件ID范围是第一个参数到第二个参数之间的全部控件,注意:此处的控件ID并不是类似于IDC_BUTTON1的命名,控件ID的连续性也不是如IDC_BUTTON1、IDC_BUTTON2...诸如此类的前缀相同后缀连续,而是控件在Resource.h中的define值,比如:

c 复制代码
#define IDC_BUTTON1                     1001

在上面代码中,第一个ON_COMMAND_RANGE的控件映射范围是1001~1005

第二个ON_COMMAND_RANGE的控件映射范围是1003~1004。

如果第一个ON_COMMAND_RANGE先于 第二个ON_COMMAND_RANGE出现,那么第二个ON_COMMAND_RANGE的作用将完全失效 ,且ON_BN_CLICKED的作用也将失效 ,从1001~1005 的控件均将映射为OnBnClickedButton1。

反之,如果第二个ON_COMMAND_RANGE先于 第一个ON_COMMAND_RANGE出现,那么1003~1004 将绑定映射到OnBnClickedButton2
1001~1002 和1005 将绑定映射为OnBnClickedButton1,且且ON_BN_CLICKED的作用仍将失效
因为每个控件只能绑定映射一次,且在后续的映射处理将自动跳过已映射的控件ID

如果你的程序中存在如上述类似的ID范围冲突,那么直接在Resource.h中修改值即可,尽量让同一个ON_COMMAND_RANGE中的控件ID连续不间断 ,且须保持Resource.h中每个控件与ID值唯一对应

相关推荐
sm_926787059 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
by209999 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
colinu9 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
wuminyu10 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
longlongzihan10 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
liulilittle10 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c
无忧.芙桃11 小时前
C++语言原理与实践(十二):list类的底层实现
c++·windows·list
沫璃染墨11 小时前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
有只小白叫岳飒12 小时前
c++智能指针 unique_ptr与函数调用
c++
Leo.yuan12 小时前
Kafka+Flink拼凑,还是FineDataLink 5.0一体化?实时数据处理的两种思路
c++·mfc