2017-10-21 42 views
1

我正在尝试使用一些系统图标,如SIID_DOCNOASSOCSIID_FOLDER并绘制它们。在Win10上没有HICON而没有Win7的面罩

我有问题,虽然我的代码在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上的整个图标区域都是黑色的。

为什么会发生这种情况?

+0

你似乎忽略返回值,所以没有错误检查 –

+0

Win10更可能是64位版本,因此一个pinvoke声明错误可以轻松地字节。这是否是同一个图标也不明显,Win10会使用更多的更好的图标。嵌入PNG图像并且没有蒙版的那个。因为PNG已经支持透明度,所以没有必要。 –

+1

[ICO文件格式的演变,第4部分:PNG图像](https://blogs.msdn.microsoft.com/oldnewthing/20101022-00/?p=12473)。 – IInspectable

回答

1

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

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

与HICON面具一起玩的日子已经过去了,如果你想绘制一个图标,你应该让Windows为你做,而不需要提取HICON的部件。如果你需要它,ImageList_DrawEx有一些混合支持。

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

+0

我确实需要在Xojo的环境中处理图标,所以我需要能够将它绘制到Xojo的Picture对象中,例如,与DrawIcon - 因为Xojo不支持在Windows上的alpha通道,但(但只有独立的img +掩码),我将不得不单独提取掩码。感谢您提供一些背景信息和更多建议来解决这个问题。我稍后会研究它们。 –

+0

好的,用你的alpha来代替面具,我现在也用Xojo来解决它。事实证明,最近的Xojo版本突然支持alpha,并且似乎在一路上破坏了面罩处理。在重写我的代码之后,我现在可以使用更简单的DrawIcon方法将图标绘制到Picture对象中,而无需分离图片和蒙版,并使用Win 10摆脱了这个问题。 –

+0

看着文章,我想知道我可以获得文件,文件夹,磁盘等高分辨率股票图标? SHGetStockIconInfo似乎只给我经典的16x16和32x32尺寸。我搜索了解决方案,但没有获得File Explorer使用的这些股票图标的现代高分辨率版本。 –