首页 > 编程语言 > 详细

问题解决——MFC Ribbon 响应函数 错乱 执行其他函数

时间:2015-04-03 22:14:08      阅读:529      评论:0      收藏:0      [点我收藏+]

==================================声明==================================

本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。

未经作者同意请勿修改(包括本声明),保留法律追究的权利。

未经作者同意请勿用于学术性引用。

未经作者同意请勿用于商业出版、商业印刷、商业引用。可洽谈。

本文不定期修正完善,为保证内容正确,建议移步原文处阅读。

本文链接:http://www.cnblogs.com/wlsandwho/p/4388382.html

=======================================================================

Win7+VS2010

最近在MFC的Ribbon按钮上写功能,偶然间添加了新的按钮和响应函数后,发现执行的却是别的函数!

=======================================================================

 让我来尝试着复现并修复一下。

=======================================================================

新建MFC程序

技术分享

技术分享

其他使用默认设置。

 运行效果:

技术分享

=======================================================================

默认的Ribbon:

技术分享

=======================================================================

下面开始添加Ribbon的东西。

添加一个 类别,默认是 类别1,而且默认是有一个 面板1。添加按钮Button1。

 技术分享

这里看属性,发现ID居然是ID_BUTTON2。不知是为何,难道是我的VS有问题?可我在另一个虚拟机环境里也是如此。

=======================================================================

将ID_BUTTON2改名为ID_BTN_T,标题改为T。添加函数OnBtnT。

技术分享

1 void CMainFrame::OnBtnT()
2 {
3     // TODO: 在此添加命令处理程序代码
4     MessageBox(TEXT("OnBtnT"));
5 }

 

运行,正常。

技术分享

=======================================================================

备份一下工程。

=======================================================================

添加1个新的按钮和1个分隔符。但是按钮的ID确是ID_BUTTON2而标题是Button1。

技术分享

我将它改为ID_BTN_WLS。标题改为WLS。

同样的添加函数。

技术分享

1 void CMainFrame::OnBtnWls()
2 {
3     // TODO: 在此添加命令处理程序代码
4     MessageBox(TEXT("OnBtnWLS"));
5 }

 

运行,成功。函数响应没有问题。

技术分享

=======================================================================

开始造了!

=======================================================================

将ID_BTN_WLS改为ID_BTN_TT。

技术分享

尝试右键添加函数,发现“添加编辑”的按钮是可用的!

居然可以添加,那么添加一个。

1 void CMainFrame::OnBtnTt()
2 {
3     // TODO: 在此添加命令处理程序代码
4     MessageBox(TEXT("OnBtnTt"));
5 }

 

现在编译链接运行程序,发现点击的是TT,但响应函数是OnBtnTt!

技术分享

 =======================================================================

观察Resource.h文件

技术分享

发现最后的两个ID是一样的!当然,必须是一样的!因为只是改了ID名,并没有删除或添加ID,所以MFC只是额外的添加了一个宏来映射到对应的控件ID。

但是由于第二个是新添加的,没有映射过函数,所以右键是可以添加上函数的。

 为了验证这个想法,先来看下MainFrm.cpp里的映射宏。

技术分享

我现在把方框内的代码更改下顺序。

技术分享

执行结果是正确的:

技术分享

现在看来,这种情况的,应该删除代码,即把下列代码删除:

1 #define ID_BTN_WLS                      32772
1 ON_COMMAND(ID_BTN_WLS, &CMainFrame::OnBtnWls)
1 void CMainFrame::OnBtnWls()
2 {
3     // TODO: 在此添加命令处理程序代码
4     MessageBox(TEXT("OnBtnWLS"));
5 }
1 afx_msg void OnBtnWls();

=======================================================================

你以为这就结束了?不是那么简单!

打开刚才备份的工程,再造一次!

=======================================================================

未完待续。

问题解决——MFC Ribbon 响应函数 错乱 执行其他函数

原文:http://www.cnblogs.com/wlsandwho/p/4388394.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!