4

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

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

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

什么不见​​了?

4

2 回答 2

7

我发布这个问题的原因是因为我无法通过谷歌找到任何答案。在研究它时,我最接近的是一些似乎不是真正解决方案的黑客。在翻遍了 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

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


更新

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

  • 右键单击RC 文件并选择Resource Includes...

右键单击 RC 文件

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

粘贴到窗口中的代码

于 2010-06-30T17:34:12.460 回答
1

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

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

    InitCommonControls();

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

    //...
    return TRUE;
}
于 2011-07-20T13:36:00.247 回答