【发布时间】:2019-05-03 04:34:54
【问题描述】:
我在 Per-Monitor v2 DPI Aware 模式下运行 .NET 桌面应用程序。正确绘制 UI 的 WinForms 部分要求所有绘制者都知道当前的 DPI 值。高级画家可以从HWND 获得它,这是一个可行的解决方案。但是,较低级别的画家只有一个 GDI+ System.Drawing.Graphics 对象。
我正在努力让System.Drawing.Graphics 告诉正确的 DPI。现在,无论其HWND 的当前 DPI 是什么,我都可以在其上看到系统级 DPI。它的DpiX/DpiY 属性是只读的,因此它们必须受到间接影响。
Graphics 有两种为控件创建控件的基本方法,可以是HWND,也可以是HDC(可能来自::GetDC 或::BeginPaint,甚至@ 987654333@ 参数)。无论哪种方式,它都只有 SYSTEM DPI 值,而不是每个监视器感知的值。制作一个Bitmap 可能会起作用,对其进行适当的配置并首先对其进行绘制,然后在控件上进行blit,但这不是太整洁也不是最优的。
所以:对于 WinForms 控件的 HWND,我看到了一个良好的每个监视器感知 DPI,我希望在 Graphics 对象 DpiX/DpiY 属性上看到同样好的值那个控件,有办法吗?
【问题讨论】:
-
看看这个答案stackoverflow.com/a/55556061/10128127。提到了如何获得实际DPI比例因子的解决方案
-
谢谢,但这个答案已经过时了(它获得了
GetDC(NULL)的 DPI,这对于在多个显示器上运行的应用程序或特别是在混合 DPI 托管行为模式下运行的应用程序是不正确的)。无论如何,我有办法获得某个HWND的 DPI,但我希望使用该 DPI 正确初始化Graphics对象并将其告知所有各方。如果某个画家只有Graphics而没有HWND,那么就没有获得DPI 的好方法。Graphics上的错误 DPI 值会产生误导。