Win10 上的 HICON 缺少掩码,但 Win7 没有

Mask missing from HICON on Win10 but not Win7

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

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

我的代码是用 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 上整个图标区域的蒙版都是黑色的。

为什么会这样?

Windows XP added support for 32-bit ARGB icons with alpha transparency. These icons still contain a black and white mask bitmap but it is often not correct, it depends on the icon editor used and how the artist drew the image! They often look like the my documents icon in this article

Vista added support 用于图标中的 PNG 图像(在图标编辑器中通常称为 "compressed")并且不包含遮罩位图。没有记录 GetIconInfo 为这些创建掩码所做的工作。

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

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