我目前正在使用this post中的方法来获取文件的图标,并且它工作了。
唯一的问题是,我只能得到16x16,32x32,48x48和256x256版本的图标集。使用巨型图标不是一个好主意,因为图标在缩放后看起来很糟糕。我认为应该有一种方法来获得某个大小的图标,因为图标文件超过了四个大小。但是怎么做呢?
附言:我不喜欢使用外部库。
发布于 2016-11-09 05:56:04
系统维护四个大小不同的图像列表:小(16x16)、大(32x32)、超大(48x48)和巨型(256x256)。
但请注意,大小只是典型的标准大小。如果系统设置为不同的DPI比例因子,则大小可以更改(例如,在200% DPI系统上,大图像列表将为64x64)。
当系统将图标添加到系统映像列表中时,它会从图标资源中选取最接近的大小,以尽可能避免缩放。这意味着,如果一个程序包含一个64x64像素的图标,它可能会被用于超大图像,它可能被用于大图像,它甚至可能被用于小图像(在400% DPI缩放的系统上)-但不能保证。
从可执行文件中最终提取特定大小的图标的唯一方法是自己加载它。
您可以不使用SHGetFileInfo
为您检索图标(或图标索引),而是要求它告诉您图标来自何处(即,包含图标资源和资源索引的可执行文件)。为此,请使用SHGFI_ICONLOCATION
标志。这将返回在szDisplayName
中包含图标的可执行路径,以及在iIcon
中包含图标的索引。
然后,您可以将该信息传递给SHDefExtractIcon
函数,使用其nIconSize
参数请求特定大小的图标。
Psuedo代码:
// 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));
https://stackoverflow.com/questions/40491391
复制相似问题