为什么不为CMFCMenuButton绘制下拉箭头?

时间:2010-06-30 17:30:16

标签: c++ mfc widget cmfcmenubutton

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

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

事实证明,即使使用Visual Studio 2010 RTM,当您创建一个全新的基于MFC Dialog的应用程序时,CMFCMenuButton也不会绘制箭头并显示相同的错误。最初我假设我没有安装或正确注册的东西。但是,MFC Feature Pack中的NewControls示例完美地显示了下拉箭头。

缺少什么?

2 个答案:

答案 0 :(得分: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

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

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

#ifndef _AFXDLL
#include "afxribbon.rc"      // Ribbon and control bars
#endif

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


更新

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

  • 右键单击 RC文件,然后选择资源包含...

Right-Click RC File

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

Code Pasted into Window

答案 1 :(得分:1)

我以这种方式为自己解决了这个问题:我在CMyApp::InitInstance添加一个子句:

BOOL CMyApp::InitInstance()
{
    CWinAppEx::InitInstance();

    InitCommonControls();

    //This! 
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

    //...
    return TRUE;
}