【问题标题】:Why isn't the dropdown arrow drawn for an CMFCMenuButton?为什么没有为 CMFCMenuButton 绘制下拉箭头?
【发布时间】:2010-06-30 17:30:16
【问题描述】:

我在尝试将 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 示例完美地显示了下拉箭头。

缺少什么?

【问题讨论】:

    标签: c++ mfc widget cmfcmenubutton


    【解决方案1】:

    我发布此问题的原因是因为我无法通过 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
    

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


    更新

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

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

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

    【讨论】:

    • “我不确定需要调整什么设置才能让视觉设计器像在 NewControls 示例项目中那样自动包含 afxribbon.rc。” 我认为*.rc 包括(afxres.rcafxribbon.rc)需要添加到3 TEXTINCLUDE 部分。第三个TEXTINCLUDE 部分是设计人员将用于自动生成资源的部分,这些资源在直接调用资源编译器时包含在内。不过,这是一个非常有用的答案;我只是被这个问题所困扰,而且它的文档记录极差。
    【解决方案2】:

    我自己解决了这个问题:我给CMyApp::InitInstance添加了一个子句:

    BOOL CMyApp::InitInstance()
    {
        CWinAppEx::InitInstance();
    
        InitCommonControls();
    
        //This! 
        CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
    
        //...
        return TRUE;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 2017-06-03
      • 2018-10-20
      • 2018-01-27
      相关资源
      最近更新 更多