如何检索给定DPI的系统映像列表?
当应用程序是系统DPI感知时,SHGetFileInfo
和类似函数返回正确缩放的系统映像列表的句柄. C示例:
handle = SHGetFileInfo(L"",&fileInfo,sizeof(fileInfo),SHGFI_SYSICONINDEX | (large ? SHGFI_LARGEICON : SHGFI_SMALLICON));
但是,对于每个监视器的DPI感知,这还不够,因为应用程序可以在不使用系统DPI的监视器上运行(或者应用程序可以有多个窗口,每个窗口在不同的监视器上,具有不同的DPI).
例如,在168 DPI(175%变焦)监视器上,使用标准96系统DPI,您可以获得小的未缩放16×16图标:
所以我希望,SHGetFileInfo(或类似的)有一个DPI感知变体,其他功能的DPI识别变体的方式如下:
> GetSystemMetricsForDpi
for GetSystemMetrics
;
> @L_403_4@ for SystemParametersInfo
;
> OpenThemeDataForDpi
for OpenThemeData
.
作为一个快速解决方案,我最终使用
SHGetImageList
,正如@MickyD所建议的那样.
如功能文档中所述(以及@JonathanPotter建议):
The
IImageList
pointer type,such as that returned in theppv
parameter,can be cast as anHIMAGELIST
as needed; for example,for use in a list view.
因此,我使用SHGetImageList通过调用0..SHIL_LAST来收集所有可用的系统映像列表大小.
对于每个返回的图像列表,我使用ImageList_GetIconSize
查询其图标大小并将它们全部缓存.
然后,当特定DPI需要图像列表时,我选择最接近的可用尺寸.
一个明显的缺点是,在具有高系统DPI但具有一个低DPI监视器的多监视器系统上,无法为低DPI监视器检索合理大小的小图标.