在Win10上没有HICON,但Win7没有

时间:2017-10-21 13:24:56

标签: winapi xojo

我正在尝试使用某些系统图标,例如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上整个图标区域的蒙版都是黑色的。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

Windows XP added support用于具有Alpha透明度的32位ARGB图标。这些图标仍然包含黑白掩码位图,但它通常不正确,这取决于所使用的图标编辑器以及艺术家如何绘制图像!它们通常看起来像this article中的我的文档图标。

Vista added support用于图标中的PNG图像(通常在图标编辑器中称为“压缩”)并且不包含遮罩位图。没有记录GetIconInfo为这些创建掩码的内容。

使用HICON面具的日子早已不复存在,如果你想绘制一个图标,你应该让Windows为你做,而不需要提取HICON的部分。如果您需要,ImageList_DrawEx可以提供一些混合支持。

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