如何在每显示器 DPI 感知应用程序中的 System.Drawing.Graphics 上获得正确的 DPI?



我正在每监视器 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 个实例。要将图形/图像加载到两种形式中,您只需要此图形的一个实例。 图形独立于显示器,内部不需要它(只需要像素集合)。

最新更新