为什么没有为CMFCMenuButton绘制下拉箭头?

bsr*_*uth 4 c++ mfc widget cmfcmenubutton

尝试将CMFCMenuButton添加到现有MFC应用程序时遇到了此问题。它工作正常,甚至调整了按钮的大小以适应下拉箭头。但是它没有绘制下拉箭头,当我将鼠标悬停在按钮上时,我看到了以下调试输出:

> Can't load bitmap: 42b8.GetLastError() = 716
> CMenuImages. Can't load menu images 3f01
Run Code Online (Sandbox Code Playgroud)

事实证明,即使使用Visual Studio 2010 RTM,在创建基于MFC对话框的全新应用程序时,CMFCMenuButton也不绘制箭头,并显示相同的错误。最初,我以为我没有正确安装或注册任何东西。但是,MFC Feature Pack中的NewControls示例完美显示了下拉箭头。

缺什么?

bsr*_*uth 5

我发布此问题的原因是因为我无法通过Google找到任何答案。我研究时发现的最接近的是几个骇客,这些骇客似乎并不是真正的解决方案。倾倒了NewControls示例之后,我终于找到了罪魁祸首。

在项目的默认.rc文件的底部,有以下代码:

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "res\YOUR_PROJECT_NAME.rc2"  // non-Microsoft Visual C++ edited resources
#include "afxres.rc"      // Standard components
#endif
Run Code Online (Sandbox Code Playgroud)

NewControls示例的.rc文件如下所示:

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "res\NewControls.rc2"  // non-Microsoft Visual C++ edited resources
#include "afxres.rc"      // Standard components
#ifndef _AFXDLL
#include "afxribbon.rc"      // Ribbon and control bars
#endif
#endif
Run Code Online (Sandbox Code Playgroud)

添加afxribbon.rc将启用MFC Feature Pack更新中的控件所需的位图资源。现在,您不能仅仅将缺少的代码添加到.rc文件的底部。如果这样做,每次使用可视设计器编辑资源文件时,添加的代码都会被删除。该问题的解决方案是将其添加到YOUR_PROJECT_NAME.rc2文件的底部:

#ifndef _AFXDLL
#include "afxribbon.rc"      // Ribbon and control bars
#endif
Run Code Online (Sandbox Code Playgroud)

确保文件底部有一个空行,否则资源编译器会报错。我不确定是否需要调整什么设置才能使视觉设计器像在NewControls示例项目中一样自动包含afxribbon.rc。但是将其添加到.rc2似乎可以解决此问题。


更新资料

请记住,您可以使用IDE修改RC文件:

  • 右键单击 RC文件,然后选择Resource Includes ...

右键单击RC文件

  • 将新代码粘贴到“ 编译时指令”区域中:

代码粘贴到窗口中