==================================声明==================================
本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。
未经作者同意请勿修改(包括本声明),保留法律追究的权利。
未经作者同意请勿用于学术性引用。
未经作者同意请勿用于商业出版、商业印刷、商业引用。可洽谈。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。
本文链接: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