我有一些WinForms应用程序在一些Windows Update之后开始出现奇怪的行为。
因此,我将字体比例设置设置为 125%(120 Dpi)。之后该应用程序开始缩短文本。调查后我找到原因,方法this.CreateGraphics()
返回Graphics
对象DpiX/DpiY == 96
,即使在OnPaint()
e.Graphics
中有DpiX/DpiY == 120
。怎么可能?
P.S。如果我在Graphics.FromHwnd
中执行OnPaint()
,它仍会返回96 Dpi。
p.s2。 Dpi虚拟化已禁用
更新
经过额外的调查后,我能够在一个简单的应用程序中重现这种行为。
默认情况下,应用程序使用 Dpi虚拟化运行(如果清单文件中未设置任何内容且未调用SetProcessDPIAware
)。
为了弄乱 Dpi SetProcessDPIAware
应该在创建表单后调用。之后会发生两件奇怪的事情:
Form.OnPaint
方法将有不同的e.Graphics.DpiX取决于焦点是什么控件,例如,如果正在调整Forms的大小OnPaint
被调用而DpiX == 96,如果将鼠标移到使用DpiX == 120调用任何Button OnPaint
。OnPaint
始终具有DpiX == 120,但this.CreateGraphics()
返回DpiX == 96。我仍然不明白为什么不同的组件有不同的 Dpi 。