加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

winforms – 每个监视器DPI感知Windows系统映像列表

发布时间:2020-12-13 21:26:56 所属栏目:Windows 来源:网络整理
导读:如何检索给定DPI的系统映像列表? 当应用程序是系统DPI感知时, SHGetFileInfo 和类似函数返回正确缩放的系统映像列表的句柄. C示例: handle = SHGetFileInfo(L"",fileInfo,sizeof(fileInfo),SHGFI_SYSICONINDEX | (large ? SHGFI_LARGEICON : SHGFI_SMALLIC
如何检索给定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;
> SystemParametersInfoForDpi for SystemParametersInfo;
> OpenThemeDataForDpi for OpenThemeData.

作为一个快速解决方案,我最终使用 SHGetImageList,正如@MickyD所建议的那样.

如功能文档中所述(以及@JonathanPotter建议):

The IImageList pointer type,such as that returned in the ppv parameter,can be cast as an HIMAGELIST as needed; for example,for use in a list view.

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

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

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

一个明显的缺点是,在具有高系统DPI但具有一个低DPI监视器的多监视器系统上,无法为低DPI监视器检索合理大小的小图标.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读