1

我正在尝试使用一些系统图标,例如SIID_DOCNOASSOCSIID_FOLDER绘制它们。

我的问题是,虽然我的代码在 Windows 7 中按预期工作,但在 Windows 10 上,检索到的图像缺少它们的掩码。我不知道为什么(PICONINFO.hbmMask我可以检索的字段GetIconInfo是非空的,表明确实有一个掩码)。

我的代码是用 Xojo 编写的,它使用 VB 的方言,但这并不重要,因为我让它在 Win 7 中工作,我认为:

dim info as SHSTOCKICONINFO
info.cbSize = SHSTOCKICONINFO.Size
SHGetStockIconInfo (SIID_DOCNOASSOC, SHGSI_ICON, info)

dim iconHandle as Integer = info.hIcon
dim destDC as Integer = ... // intialized outside
DrawIconEx (destDC, 0, 0, iconHandle, 0, 0, 0, 0, DI_MASK)

上面的代码获取一个普通文件的图标,然后绘制它的掩码。虽然在 Win 7 上掩码是正确的,但在 Win 10 上整个图标区域的掩码都是黑色的。

为什么会这样?

4

1 回答 1

2

Windows XP 添加了对具有 alpha 透明度的 32 位 ARGB 图标的支持。这些图标仍然包含黑白蒙版位图,但通常不正确,这取决于使用的图标编辑器以及艺术家如何绘制图像!它们通常看起来像本文中的我的文档图标。

Vista 在图标中添加了对 PNG 图像的支持(在图标编辑器中通常称为“压缩”)并且不包含掩码位图。没有记录GetIconInfo为这些创建掩码的内容。

玩 HICON 面具的日子已经一去不复返了,如果你想画一个图标,你应该让 windows 为你做,而不是提取 HICON 的部分。ImageList_DrawEx如果你需要它有一些混合支持。

如果您出于某种原因绝对需要蒙版,那么当图标包含 Alpha 透明度时,您应该自己构建它。选择某种阈值(25、50 等等)并在检查 alpha 值时将高于该阈值的所有内容视为透明。

于 2017-10-21T14:35:32.963 回答