【问题标题】:CMFCButton::SetImage - Bitmaps won't showCMFCButton::SetImage - 位图不会显示
【发布时间】:2019-07-30 18:30:06
【问题描述】:

我正在尝试使用来自CMFCButton 的函数SetImage 为我的按钮加载位图。我没有收到任何错误或其他东西,只是一个普通的按钮。我正在用icons 做同样的事情,它可以工作,但我也需要它来加载bitmap。我需要从路径而不是资源中LoadImage

这是我的代码:

iconResource = path + m_type + _T("U") + extension; //i.e : C:\test\earthU.bmp
HANDLE hIcon =  ::LoadImage(nullptr, iconResource, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//same thing for Hot and Disable bitmap

以及对SetImage 函数的调用:

SetImage((HBITMAP)hIcon, 0, (HBITMAP)hIconHot, 0 , (HBITMAP)hIconDis);

【问题讨论】:

  • 您可能会或可能不会收到错误,但您不知道,因为您忽略了检查错误。 LoadImage 通过返回 NULL 报告错误。使用提供的代码 sn-p,我们也看不到 iconResource 是否持有正确的值。 operator+ 的作用取决于 pathm_type 的类型。
  • 你检查LoadImage成功了吗?如果没有,您是否检查过GetLastError 返回的内容(这可能会提供一些关于原因的线索)。如果你没有做这些事情,你现在应该做,并在这里发布结果(假设这样做并不能帮助你解决你自己的问题)。
  • 我的HANDLE 包含一个很好的句柄(不是NULL),我已经尝试过GetLastError,我得到了回报0。
  • @Emile 如果您从资源加载图像,它是否有效?抱歉,我不知道问题是什么,只是想帮助您缩小问题范围。我怀疑您可能必须调试 MFC 代码才能深入了解。
  • 将位图的 LR_LOADFROMFILE 更改为 LR_CREATEDIBSECTION|LR_LOADFROMFILE

标签: c++ winapi mfc


【解决方案1】:

在为CMFCButton加载位图文件时使用LR_CREATEDIBSECTION|LR_LOADFROMFILE标志

::LoadImage(nullptr, bitmapfile, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);

部分解释:

CMFCButton ("afxbutton.cpp") 的 MFC 源代码显示它为 LoadImage 添加了 LR_CREATEDIBSECTION。这没有记录,也不清楚为什么需要它。当源位图不是 32 位时,似乎需要LR_CREATEDIBSECTION

【讨论】:

  • MFC 可能会添加LR_CREATEDIBSECTION,以便它可以在内部访问图像的规范表示。在精神上与将所有日期时间保持在 UTC 中类似:无论环境如何,信息都是真实的。 DIB中的“DI”毕竟意味着“设备独立”,设备是外部状态DDB需要正确解释。如果您有时间,请在 CMFCButton 文档页面上发布问题。
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 2014-04-18
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多