我能得到64x64版本的文件图标吗?

本文关键字:文件 图标 版本 64x64 | 更新日期: 2023-09-27 18:17:02

我目前正在使用这篇文章中的方法来获取文件的图标,它工作了。

唯一的问题是,我只能得到16x16, 32x32, 48x48和256x256版本的图标集。使用超大版本不是一个好主意,因为图标在缩放后看起来很糟糕。我相信应该有一种方法来获得一定大小的图标,因为图标文件有超过四种大小。但如何呢?

注:我不喜欢使用外部库

我能得到64x64版本的文件图标吗?

系统维护四个不同大小的图像列表;小号(16x16)、大号(32x32)、特大号(48x48)和超大号(256x256)。

但请注意,尺寸只是典型的标准尺寸。如果系统设置为不同的DPI缩放因子,则大小可以更改(例如,在200% DPI系统上,大图像列表将是64x64)。

当系统将一个图标添加到系统图像列表时,它会从图标资源中选择最接近的大小,以尽可能地避免缩放。这意味着,如果一个程序包含一个64x64像素的图标,它可能被用于超大图像,它可能被用于大图像,它甚至可能被用于小图像(在400% DPI缩放系统上)-但没有保证。

从可执行文件中明确提取特定大小的图标的唯一方法是自己加载它。

不使用SHGetFileInfo为您检索图标(或图标索引),相反,您可以要求它告诉您图标来自何处(即包含图标资源和资源索引的可执行文件)。为此,使用SHGFI_ICONLOCATION标志。这将返回包含szDisplayName中图标的可执行路径,以及iIcon中图标的索引。

你可以把这个信息传递给SHDefExtractIcon函数,使用它的nIconSize参数来请求一个特定大小的图标。

Psuedo-code:

// find icon location for .txt file icons
SHFILEINFO sfi{};
SHGetFileInfo(L".txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_USEFILEATTRIBUTES | SHGFI_ICONLOCATION);
// extract the 64x64 pixel icon
HICON hIcon;
SHDefExtractIcon(sfi.szDisplayName, sfi.iIcon, 0, nullptr, &hIcon, MAKELONG(0, 64));