6

如何检索给定 DPI 的系统图像列表?

当应用程序是系统 DPI 感知时,SHGetFileInfo和类似的函数将句柄返回到正确缩放的系统图像列表。C++ 示例:

handle =
  SHGetFileInfo(L"", 0, &fileInfo, sizeof(fileInfo),
                SHGFI_SYSICONINDEX | (large ? SHGFI_LARGEICON : SHGFI_SMALLICON));

但是对于每个显示器的 DPI 感知,这还不够,因为应用程序可以在不使用系统 DPI 的显示器上运行(或者应用程序可以有多个窗口,每个窗口在不同的显示器上,具有不同的 DPI)。

例如,在 168 DPI(175% 缩放)显示器上,使用标准 96 系统 DPI,您会看到未缩放的 16x16 小图标:

未缩放的系统图标

所以我希望,SHGetFileInfo(或类似的)有一个 DPI 感知变体,就像其他功能的 DPI 感知变体一样:

4

1 回答 1

3

作为一个快速的解决方案,我最终使用了 @MickyD 的SHGetImageList建议。

如函数文档中所述(以及@JonathanPotter 所建议的)

IImageList指针类型,如参数中返回的类型,可以ppv根据HIMAGELIST需要强制转换为an;例如,用于列表视图。

因此,我使用SHGetImageList来收集所有可用的系统映像列表大小,方法是调用0..SHIL_LAST.

对于每个返回的图像列表,我使用查询其图标大小ImageList_GetIconSize并将它们全部缓存。

然后,当特定 DPI 需要图像列表时,我会选择最接近的可用尺寸。

一个明显的缺点是,在具有高系统 DPI 的多显示器系统上,但使用一台低 DPI 显示器时,无法为低 DPI 显示器检索合理大小的小图标。

于 2017-04-28T19:04:05.660 回答