【发布时间】: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