我正在每监视器 v2 DPI 感知模式下运行 .NET 桌面应用程序。正确绘制 UI 的 WinForms 部分需要所有绘制者都知道当前的 DPI 值。高级画家可以从HWND
得到它,这是一个可行的解决方案。但是,较低级别的画家只有一个 GDI+System.Drawing.Graphics
对象。
我正在努力让System.Drawing.Graphics
告诉正确的 DPI。现在,无论其HWND
的当前DPI如何,我都在其上看到了系统级DPI。它的DpiX
/DpiY
属性是只读的,因此必须间接影响它们。
Graphics
有两种基本的方式来为控件创建控件,要么是控件HWND
,另一种是控件上的HDC
(可能来自::GetDC
或::BeginPaint
甚至WM_PAINT
参数)。无论哪种方式,它都只有系统 DPI 值,而不是每个显示器感知的值。制作一个Bitmap
,适当地配置它并首先绘制到控件上,然后到控件上,这可能会起作用,但这既不太整洁也不是最佳。
所以:对于 WinForms 控件的HWND
,我看到了一个很好的每显示器感知 DPI,我希望在该控件上的Graphics
对象DpiX
/DpiY
属性上看到相同的好值,有办法吗?
现在应该有办法了。要在两台显示器上显示表单,您必须创建 2 个实例。要将图形/图像加载到两种形式中,您只需要此图形的一个实例。 图形独立于显示器,内部不需要它(只需要像素集合)。