如何在C# .NET中获取DPI值?

15

我正在尝试使用C#构建Windows表格应用程序。

如何在.NET中获取DPI?

我以前读过,可以使用DPIX和DPIY来获取当前DPI。

这是正确的吗?

谢谢大家。

2个回答

34

使用 Graphics 类的实例。您可以在表单中使用以下方式获取该实例(可以在表单的 Load 事件处理程序中):

float dx, dy;

Graphics g = this.CreateGraphics();
try
{
    dx = g.DpiX;
    dy = g.DpiY;
}
finally
{
    g.Dispose();
}

如果要将像素转换为点,请使用 DPI 值,那么可以使用哪个 DPI(DpiX 或 DpiY)?或者有一些技巧可以将像素值转换为点吗?谢谢... - Learn Programming
一个像素是一个位置,因此它有X和Y坐标。使用DpiX查找X坐标,使用DpiY查找Y坐标。同样的事情也适用于缩放 - 水平缩放因子使用DpiX确定,垂直缩放因子使用DpiY确定。 - Thorsten Dittmar
9
即使在 Windows 10 上将缩放设置为 150%,我发现它返回的结果仍然是 96。这是在一个旧应用程序中,该应用程序没有告诉 Windows 它是 DPI 感知的。我认为还需要进行额外的更改才能使此方法起作用。 - Daniel Earwicker
3
DPI并不取决于Windows的缩放设置,它取决于屏幕。DPI值表示每英寸有多少像素(或PPI - 每英寸像素数)。由于像素不是完美的正方形,而是实际上是长方形,因此其X和Y值不同。当你想要按实际大小显示某个内容时,需要使用DPI(例如,如果你想在屏幕上显示一个宽度为3英寸、高度为5英寸的矩形),其像素大小将为 Width = 3*DpiX; Height = 5*DpiY; - Matheus Rocha
值得指出的是,默认情况下g.MeasureString(text, font)返回的是文本的像素宽度。如果您需要以设备无关单位(例如用于打印)进行测量,请在此之前设置g.PageUnit = GraphicsUnit.Millimeter(或Point等)。这样,即使屏幕DPI发生变化,测量结果也将保持一致。 - undefined
显示剩余2条评论

7

获取WinForms应用程序中DPI的现代方法

在.NET Framework 4.7或更新版本(例如.NET 6.0)中,您可以使用Control.DeviceDpi属性来获取当前显示控件的屏幕的DPI值。

int dpi = this.DeviceDpi;

Control.DeviceDpi 属性返回的值取决于应用程序的 DPI 感知模式。在 .NET 5.0 及更高版本中,可以使用 Application.SetHighDpiMode 方法在 WinForms 应用程序的入口点中设置 DPI 感知模式。可能的模式列在 此 MSDN 页面上。


DPI意识非常重要。在一个个性化设置为120 DPI的显示器上,form.DeviceDpi仍然会报告"96",但是@ThorstenDittmar在答案中提到的方法会正确返回"120"。 - undefined
嗨 @AlainD,你配置了应用程序的高DPI模式为PerMonitorV2吗?如果没有,请配置并且你应该能够获得正确的DPI值。请查看我的回答的第二部分,我添加了一个代码示例。 - undefined
嗨 @PavelVladov:不,我的应用程序不支持这个,因为我是针对.NET 4.7的。来自.NET 5.0的额外细节很有用,谢谢! - undefined
嗨 @AlainD,对于.NET 4.7,你应该在清单文件中声明你的应用程序的DPI感知。我在我的答案中编辑了关于此的额外信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接