2011-05-21 70 views
7

我需要找出用户的屏幕是否设置为正常的96 dpi(小尺寸),大的120 dpi字体或其他东西。我如何做到这一点在VB.NET(首选)或C#?如何检测用户的字体(DPI)是否设置为小,大或其他?

+0

一个土生土长的方式(用Delphi编写的,但只使用本地的Windows API):'VAR DC:HDC; res:整数; 开始 dc:= GetDC(0);如果dc> 0,则 尝试 res:= GetDeviceCaps(dc,LOGPIXELSX); 终于 ReleaseDC(0,dc) end;' – 2011-05-21 15:46:09

+0

正如Andreas所说,你也可以调用Windows API函数'GetDC'和'GetDeviceCaps'来获得这些信息,但是你必须使用P/Invoke从.NET应用程序中获取它们,这样做几乎没有什么好处,因为'Graphics'类已经在托管代码中很好地包装了它。 – 2011-05-21 15:53:41

+1

但无论如何,**谢谢你[付税](http://blogs.msdn.com/b/oldnewthing/archive/2004/07/14/182971.aspx)** !! – 2011-05-21 15:54:31

回答

13

最好办法就是让形式自动调整自身的大小,根据用户当前的DPI设置。要做到这一点,只需将AutoScaleMode property设置为AutoScaleMode.Dpi并启用AutoSize属性即可。你可以做到这一点无论是从属性窗口在设计或虽然代码:

Public Sub New() 
    InitializeComponent() 

    Me.AutoScaleMode = AutoScaleMode.Dpi 
    Me.AutoSize = True 
End Sub 

或者,如果你需要知道这个信息,同时绘制(如在Paint事件处理方法),可以提取来自Graphics class实例的DpiXDpiY属性的信息。

Private Sub myControl_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) 
    Dim dpiX As Single = e.Graphics.DpiX 
    Dim dpiY As Single = e.Graphics.DpiY 

    ' Do your drawing here 
    ' ... 
End Sub 

最后,如果你需要确定即时的DPI级别,你必须创建Graphics类的临时实例为您的表单,并检查DpiXDpiY特性,如上图所示。表格类的CreateGraphics method使得这很容易做到;只需确保将此对象的创建包装在Using statement中以避免内存泄漏。示例代码:

Dim dpiX As Single 
Dim dpiY As Single 

Using g As Graphics = myForm.CreateGraphics() 
    dpiX = g.DpiX 
    dpiY = g.DpiY 
End Using 
+0

嗨,谢谢!但是,dpi与屏幕大小(X/Y)或字体大小(X仅限于可用)有关吗?换句话说,我可以确定在所有情况下dpiX = dpiY?否则,新的字体看起来会拉长,不是吗? – 2011-05-22 12:15:41

+0

@Didier:是的,通常情况下,dpiX将相当于dpiY。如果不是,它会看起来很紧张。这取决于分辨率和用户选择的DPI设置。默认的小设置有dpiX = 96和dpiY = 96.默认大设置有dpiX = 120和dpiY = 120.您可以查看[此MSDN页面](http://msdn.microsoft.com/en-us/ library/dd464646.aspx)的高DPI应用程序。链接的[how-to页面](http://msdn.microsoft.com/en-us/library/dd464660.aspx)非常好。 – 2011-05-22 13:16:50

4

看看DpiXDpiY属性。例如:

using (Graphics gfx = form.CreateGraphics()) 
{ 
    userDPI = (int)gfx.DpiX; 
} 

在VB:

Using gfx As Graphics = form.CreateGraphics() 
    userDPI = CInt(gfx.DpiX) 
End Using 
相关问题