【问题标题】:Unable to Set Overlay Image for CListCtrl无法为 CListCtrl 设置叠加图像
【发布时间】:2015-07-01 06:38:09
【问题描述】:

我正在尝试在 MFC 对话框中的“CListCtrl”中显示带有叠加层的图像。列表控件处于报告/详细信息模式。

我找不到在我的某些商品图像上显示叠加层的好文档。

失败的代码如下所示。我有一个 64x32 位图,前 32x32 像素中有一个文件夹图标,第二个 32x32 像素中有一个叠加图像 (IDB_FOLDERS32_OVERLAY)。位图具有似乎可以正常工作的透明度。

CBitmap bm;
bm.LoadBitmap(IDB_FOLDERS32_OVERLAY);
m_ImageList.Create(32, 32, ILC_COLOR32, 2, 1);
int index = m_ImageList.Add(&bm, RGB(0, 0, 0));
ASSERT(index >= 0);
m_ImageList.SetOverlayImage(index, 2);

最后一行返回 0,表示错误。 GetLastError() 返回 6 (ERROR_INVALID_HANDLE)。

我终其一生都无法在网络上的任何地方找到有关如何执行此操作的合理文档。谁能看到我错过了什么?

【问题讨论】:

  • “除非图像列表是使用掩码创建的,否则对该方法的调用失败并返回 E_INVALIDARG。” 可能吗? ILC_COLOR32 可能还不够,可能还需要ILC_MASK
  • MFC 文档的质量通常很低。幸运的是,对于 MFC 中的几乎所有内容,都有相应的 Windows API 服务,并提供更好的文档。 @Jonathan 的引用来自 ImageList_SetOverlayImage。更多信息请访问About Image Lists。 MFC 的另一个可用选项是单步执行源代码。这通常有助于确定故障的根本原因。
  • @JonathanPotter:是的,设置 ILC_MASK 标志会导致方法返回 1 而不是 0。但是即使对于 Windows API 服务,文档仍然很糟糕。我想我会再花一天的时间来弄清楚如何正确地创建我的面具。再说一次,我认为简单地拥有两张图像可能更有意义,其中一张已经应用了叠加层。不知道为什么我要花几天时间来弄清楚叠加层是如何工作的。
  • 掩码位图只是一个 1 位的位图,其中一个像素不完全透明。我实际上认为,如果你有一个带有 alpha 的 32 位图像,它甚至不会被使用——它可能被认为是在这种情况下需要ILC_MASK 的错误。
  • PS 抱怨微软文档很糟糕就像抱怨天空是蓝色的一样。接受它并继续前进。 :)

标签: c++ winapi mfc overlay imagelist


【解决方案1】:

Jonathan Potter 是正确的,我需要包含 ILC_MASK 标志以便 SetOverlayImage() 返回一个表示成功的值。

但是,在我可以在网上找到的所有文档中,都没有提供有关如何执行此操作的完整说明。例如,我没有找到显示我的位图应该是什么样子的单一来源。

为了使它更复杂,我使用ILC_COLOR32 来表示带有 alpha(透明度)通道的 32 位彩色位图。所以我没有蒙版,而且蒙版似乎与 alpha 通道不兼容。

所以最后,我只创建了一个包含两个图像的位图:第一个是一个文件夹,第二个是一个文件夹,上面有我的叠加图像。问题解决了。

在这一点上,尝试弄清楚是否或如何使用 32 位 Alpha 通道位图创建蒙版似乎毫无意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多