MFC EditBrowse 控件在运行时不显示文件夹图标

Posted

技术标签:

【中文标题】MFC EditBrowse 控件在运行时不显示文件夹图标【英文标题】:MFC EditBrowse control does not display the folder icon at runtime 【发布时间】:2020-02-18 23:40:13 【问题描述】:

我有一个包含 MFC EditBrowse 控件的对话框类型的应用程序。此控件在右侧包含一个文件夹/放大镜图标,用户应该单击该图标以弹出文件夹浏览器弹出窗口。

该文件夹/放大镜图标在 Visual Studio 的对话框编辑器中正确显示,但在运行时它显示为一个普通的平面按钮。否则,它的行为正常 - 即,当用户单击“确定”时,会弹出浏览器弹出窗口并显示所选文件夹。

使用调试器运行时,VS 输出窗口中会显示一条消息“无法加载位图:4299”。该消息显示在我的 OnInitDialog() 中的 CDialogEx::OnInitDialog() 行之后。

我已经编写了测试程序,它们可以正确显示图标。我还在我的原始程序中添加了额外的 EditBrowse 控件,但他们遇到了同样的问题,只是添加了另一行“无法加载位图”。我还添加了其他 MFC 控件,其中一些控件也不显示其图标(或其他内容)。

通过从 OnInitDialog 调用 EnableBrowseButton() 和 EnableFolderBrowswButton(),我设法稍微影响了这个问题。如果我这样做,我会得到一个看起来像 3 个水平点的图标:

哪个更好,但我更喜欢文件夹/放大镜图标。

这是一个足够复杂的应用程序,我不想从头开始重写它,而且我想了解发生了什么。我相当肯定这是在开发应用程序时添加/删除控件的结果,但不知道从哪里开始追踪出错的地方。

关于如何调试的想法?顺便说一句,这是 VS 2010。

【问题讨论】:

检查您的 *.rc 文件。你看到这条线了吗:#if !defined(_AFXDLL) ... #include "afxribbon.rc" ... #endif?那就是该资源应该在的地方 ("browe32.bmp") 感谢@BarmakShemirani 的回复!我没有看到 #include "afxribbon.rc" 行。但是我也没有在正常工作的测试程序中看到这一点。我在工作示例目录中搜索了“afxribbon”,并在 .sdf、pdb、tlog、pch 和 stdafx.obj 文件中找到了匹配项。但我似乎在非工作样本中得到了相同的基本结果。同样,在 browse32 上的搜索(我假设您的“browe32.bmp”中有错字?)在 .sdf 和 pch 中显示工作和非工作程序的结果。我也应该指出这是我正在使用的 VS 2010。 @BarmakShemirani 哎呀!!您已引导我进行修复/解决方法!我最后只是停留在 app.rc 文件中的 #include "afxribbon.rc" (没有 #if !def 东西),现在我有了我的文件夹图标。如果您想将其写为答案,我会接受。 【参考方案1】:

CMFCEditBrowseCtrl 使用可视化管理器从 MFC 资源加载位图。

此资源加载于"afxribbon.rc"

确保以下这些行包含在主 *.rc 文件中(这是 VS 向导创建 *.rc 文件的方式)

#if !defined(_AFXDLL)
#include "afxribbon.rc"   // MFC ribbon and control bar resources
#endif

(我猜你可以省略#if/end 语句,但它的存在可能是有原因的)

或者,CMFCEditBrowseCtrl::SetBrowseButtonImage 可用于分配用户图标。

【讨论】:

我对此做了进一步的实验,发现问题的“原因”是在项目配置属性中选择“在静态库中使用 MFC”与“在共享 DLL 中使用 MFC” -> 常规 -> 使用 MFC。在这两个设置之间切换将破坏/修复图标显示。如果您在这两个设置之间切换,@BarmakShemirani 的解决方案中的 #if !defined... 是必要的。如果您使用静态,则不需要#if/end 位。我希望有人能指出我对此的 MS 解释。 我说/写得太快了。添加#inc 功能区位确实可以解决问题,但会导致 IDE 在尝试打开(例如)对话框时打开 .rc 文件出现问题。 (错误 RC2188 ...RibbonStyle2007Aqua.rc2(6) 所以,不是那么完整的修复/解决方法:( 教训似乎是,不要摆弄共享/静态 MFC 设置。 呸!找到了问题,但还不足以编辑我之前的评论! #if-#inc-#end 内容必须位于 .rc 文件底部的#ifndef APSTUDIO_INVOKED 部分内。否则,在尝试从 IDE 中编辑资源时会出现问题。

以上是关于MFC EditBrowse 控件在运行时不显示文件夹图标的主要内容,如果未能解决你的问题,请参考以下文章

MFC:显示文本项的表格显示

wpf image控件 设计时显示图片,运行时不显示

CComboBox MFC 控件出现问题

我正在尝试使用 MFC 在列表控件上显示 SQL 结果

VC++对话框里新添加的控件运行时不显示

MFC 在控件上显示图片不起作用