写一个DPI自适应的Win32程序

当前高DPI的显示器越来越流行,动辄2K,甚至4K,一些老的应用程序在这些显示器显示效果非常差,这是为什么了呢?

这是因为老的应用程序经常以96DPI来设计的,老的应用程序缺省是DPI Unawareness的,所以系统会自动把程序进行拉伸,比如现在DPI是144,那么程序界面就像拉伸150%,这就会造成界面模糊,下面是一个例子,

DPI_96
DPI为96的界面


把DPI改为150%(144)之后

144dpi
DPI变为150%(144)后的界面



后来Windows引入了DPI Awareness的概念,可以有效解决这个问题,但是老的程序需要做一些调整,下面是对应的两种方法(当然还有其他的方法,这里就不多讨论,原理差不多,只是控制更精确):

1. API SetProcessDpiAwareness

PROCESS_DPI_UNAWARE

DPI unaware. This app does not scale for DPI changes and is always assumed to have a scale factor of 100% (96 DPI). It will be automatically scaled by the system on any other DPI setting.

只有在系统为96dpi(100%)的时候,程序才显示完全正确。系统自动根据”当前DPI/96”做缩放调整,UI在高DPI情况下会有锯齿和模糊

PROCESS_SYSTEM_DPI_AWARE

System DPI aware. This app does not scale for DPI changes. It will query for the DPI once and use that value for the lifetime of the app. If the DPI changes, the app will not adjust to the new DPI value. It will be automatically scaled up or down by the system when the DPI changes from the system value.

这个相当于静态DPI自适应,程序启动的时候系统会记下当前的DPI,如果切换到另外一个不同的DPI显示器上,或者改动DPI设置,系统会根据”当前DPI/程序启动时的DPI”做缩放调整。
这个时候程序代码需要自己根据当前的静态DPI对UI布局和字体大小做调整,一般来讲,就是让各元素坐标乘上scale_factor: 系统启动时候的DPI/96,然后对一些布局做一些调整。
优点
维护起来相对比较简单。如果应用场景不涉及到多显示器显示和DPI运行时调整的支持,建议使用此种模式。
缺点:
在程序运行过程中,调整系统DPI,或者移动程序到另外一个不同DPI设置显示器上,还是会出现锯齿和模糊的问题。

PROCESS_PER_MONITOR_DPI_AWARE

Per monitor DPI aware. This app checks for the DPI when it is created and adjusts the scale factor whenever the DPI changes. These applications are not automatically scaled by the system.

这个相当于动态DPI自适应,程序需要根据当前的DPI自动调整UI layout和字体等,如果做得好的话,可以做出完美效果。当然,如果系统DPI被改动,或者切换到另外一个不同DPI设置的显示器上,系统会发送WM_DPICHANGED过来给各个窗口,窗口此时需要动态调整UI layout和字体等,程序实现比较复杂。

2. Manifest setting

这里写图片描述
此时不需要调用系统API,各个设置的意义同上。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值