如何在每监视器DPI感知应用中的System.Drawing.Graphics上获取正确的DPI?

时间:2019-05-03 04:34:54

标签: c# winforms dpi

我正在以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(可能来自{{1} }或::GetDC甚至::BeginPaint参数)。无论哪种方式,它仅具有SYSTEM DPI值,而没有每个监视器可识别的值。制作一个WM_PAINT,对其进行适当的配置,然后首先将其绘制,然后将其涂抹到控件上可能会起作用,但这并不是太整洁也不是最佳的。

因此:我在WinForms控件的Bitmap上看到了一个很好的针对每个监视器的DPI,我想在HWND对象Graphics上看到相同的漂亮值/ DpiX上该控件的属性,有办法吗?

1 个答案:

答案 0 :(得分:0)

现在应该有办法了。要在两个监视器上显示表单,您必须创建2个实例。要将图形/图像加载到两种形式,您只需要该图形的一个实例。 图形独立于您的显示器,而内部不需要它(仅一个像素集合)。