Winapi Win10上的HICON缺少掩码,但不是Win7

Winapi Win10上的HICON缺少掩码,但不是Win7,winapi,xojo,Winapi,Xojo,我正在尝试使用一些系统图标,如SIID\u DOCNOASSOC和SIID\u文件夹并绘制它们 我的问题是,虽然我的代码在Windows 7中正常工作,但在Windows 10中检索到的图像缺少掩码。我无法解释原因(我可以使用GetIconInfo检索的PICONINFO.hbmMask字段为非空,表明确实存在掩码) 我的代码是用Xojo编写的,Xojo使用的是VB方言,但这并不重要,因为我在Win7中使用了Xojo,我认为: dim info as SHSTOCKICONINFO info.c

我正在尝试使用一些系统图标,如
SIID\u DOCNOASSOC
SIID\u文件夹
并绘制它们

我的问题是,虽然我的代码在Windows 7中正常工作,但在Windows 10中检索到的图像缺少掩码。我无法解释原因(我可以使用
GetIconInfo
检索的
PICONINFO.hbmMask
字段为非空,表明确实存在掩码)

我的代码是用Xojo编写的,Xojo使用的是VB方言,但这并不重要,因为我在Win7中使用了Xojo,我认为:

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上整个图标区域的遮罩都是黑色的

为什么会发生这种情况?

对于具有alpha透明度的32位ARGB图标。这些图标仍然包含黑白蒙版位图,但通常不正确,这取决于使用的图标编辑器和艺术家绘制图像的方式!它们通常看起来像中的“我的文档”图标

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

玩HICON面具的日子已经一去不复返了,如果你想画一个图标,你应该让windows帮你画,而不需要提取HICON的部分
ImageList\u Dropex
提供了一些混合支持,如果您需要的话


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

您似乎忽略了返回值,因此没有错误检查Win10更可能是64位版本,因此pinvoke声明错误很容易被忽略。这是否是同一个图标也不明显,Win10将使用更多的更高级的图标。嵌入PNG图像且没有遮罩的图像。不需要,因为PNG已经支持透明性。附带问题:我似乎只从SHGetStockIconInfo获得了相当低的分辨率图标(32x32)。如何获得Win 10中可用的高分辨率图标?我确实需要在Xojo的环境中对图标进行后期处理,因此我需要能够将其绘制到Xojo的图片对象中,例如,使用DrawIcon-由于Xojo在Windows上不支持alpha通道(但只支持单独的img+掩码),因此我必须单独提取掩码。感谢您提供一些背景信息和更多解决此问题的建议。我以后会研究的。好吧,根据你的指示,用alpha代替mask,我现在也用Xojo解决了这个问题。事实证明,最近的Xojo版本突然支持Alpha,并且似乎已经破坏了掩码处理。重新编写代码后,我现在可以使用更简单的DrawIcon方法将图标绘制到图片对象中,而无需将图片和掩码分开,这就解决了Win 10的问题。看看这篇文章,我想知道如何获得文件、文件夹、磁盘等的高分辨率库存图标?SHGetStockIconInfo似乎只提供了经典的16x16和32x32尺寸。我搜索了很多解决方案,但没有找到文件浏览器使用的这些股票图标的现代高分辨率版本。你在使用Drawiconex吗?普通绘图图标仅绘制小图标。或者,您可以使用SHGSI_ICONLOCATION(然后调用LoadImage)或SHGSI_SYSICONINDEX(和jumbo imagelist)。大多数图标都有256x256版本。