理解windows DPI 以及开发过程中的迷惑问题

本文详细解析了DPI(每英寸点数)的概念及其在不同Windows系统版本中的表现形式,包括DPI感知级别的设置方法,以及在实际开发过程中可能遇到的问题。

一、DPI定义

DPI全称是dots per inch, 也就是每英寸的点数,在显示器上就是每英寸的像素个数,Window上一般默认是96 dpi 作为100% 的缩放比率, 但是要注意的是该值未必是真正的显示器物理值, 只是Windows里我们的一个参考标准。

二、为什么设置DPI会使我们看到的程序变大

简单来说我们可以直接理解为系统的机制,我们暂时不讨论程序对DPI的适配,只讨论系统在设置125%以后程序会放大的原理,如果打个比方的话就像系统使用个放大镜一样让我们的程序看起来变大了,但是实际上程序还是那么大,只不过视觉上看起来按照设置的DPI比例放大了而已。

如果讨论程序对DPI的适配,也就是说,程序感知到了桌面的dpi变为125%,那么程序在感知到桌面的dpi变化之后,程序把自身大小调成125%的大小,这个改变是与系统无关的,程序只是感知到系统DPI的变化,从而自己按照系统DPI去适配自己程序放大后的效果。这个是程序级别的放大,所以如果程序本身对系统DPI有所感知,我们看到的125%分辨率下的程序就不是简单的模糊放大,可能是实际上的像素点变多(也有程序感知到系统DPI为125%以后却还保持自己的程序界面为100%的大小,例如生死狙击桌面版本)。

举个例子理解,在Win10系统下我们原生DPI100%,然后去量一个窗口的大小为100*100,如果此时我们把DPI设置为200%,我们会发现视觉上窗口变大了两倍,但是实际上窗口细节是模糊的,这就是因为系统使用了DWM Desktop Window  Manager)虚拟化机制去帮助程序适配高分辨率。

DPI比例与每英寸点数对应关系:

 

屏幕比例

每英寸点数

100%

96

125%

120

150%

144

175

192

 

注:以上的每英寸点数为代码中关于DPI问题经常使用到的数字

 

三、不同系统下的DWM机制

对于系统dpi的改善,可以分为三个时间段

1. WindowsXP阶段:

对高DPI的支持比较差劲, 大部分情况下就是字体的放大, 当然我们程序也可以通过GetDeviceCaps(hDC, LOGPIXELSX)获取DPI后自己对绘画的内容进行缩放。因为现在已经用不到了,不作过多讨论。

2.Windows Vista/Windows 7/Windows 8阶段:

Windows Vista / 7 / 8

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值