欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > MFC的控件无法触发事件函数(ON_COMMAND_RANGE的映射范围冲突)

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

2024/12/1 0:19:58 来源:https://blog.csdn.net/zixingcai/article/details/141746887  浏览:    关键词:MFC的控件无法触发事件函数(ON_COMMAND_RANGE的映射范围冲突)

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

错误原因:
如下图,假设为所使用的两个ON_COMMAND_RANGE和一个ON_BN_CLICKED,从IDC_BUTTON1IDC_BUTTON5的ID值依次为1001,1002,1003,1004,1005

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值,比如:

#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~10021005将绑定映射为OnBnClickedButton1,且且ON_BN_CLICKED的作用仍将失效
因为每个控件只能绑定映射一次,且在后续的映射处理将自动跳过已映射的控件ID

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com