2011-05-21 19 views
7

Necesito averiguar si la pantalla del usuario está configurada en 96 ppp normales (tamaño pequeño), fuentes grandes de 120 ppp, u otra cosa. ¿Cómo hago eso en VB.NET (preferido) o C#?¿Cómo puedo detectar si la fuente del usuario (DPI) está configurada como pequeña, grande o alguna otra cosa?

+0

Una forma nativa (escrito en Delphi, pero sólo mediante la API nativa de Windows): 'var DC: HDC; res: entero; begin dc: = GetDC (0); if dc <> 0 then try res: = GetDeviceCaps (dc, LOGPIXELSX); finalmente ReleaseDC (0, dc) end; ' –

+0

Como sugiere Andreas, también puede llamar a las funciones API de Windows' GetDC' y 'GetDeviceCaps' para obtener esta información, pero deberá usar P/Invoke para llegar a ellos desde una aplicación .NET, y hay un pequeño beneficio al hacerlo, ya que la clase 'Graphics' ya ha finalizado esto muy bien en el código administrado. –

+1

Pero de todos modos, ** gracias por [pagar sus impuestos] (http://blogs.msdn.com/b/oldnewthing/archive/2004/07/14/182971.aspx) ** –

Respuesta

13

La forma mejor es sólo para dejar que el tamaño de formulario automáticamente, en base a la configuración de DPI actuales del usuario. Para hacerlo, simplemente configure AutoScaleMode property en AutoScaleMode.Dpi y habilite la propiedad AutoSize. Esto se puede hacer ya sea desde la ventana Propiedades en el diseñador oa través de código:

Public Sub New() 
    InitializeComponent() 

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

O, si lo que necesita saber esta información, mientras que dibujo (como en el método de control Paint caso), puede extraer la información de las propiedades DpiX y DpiY de la instancia Graphics class.

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 

Por último, si es necesario determinar el nivel de DPI sobre la marcha, tendrá que crear una instancia temporal de la clase Graphics para su formulario, y comprobar los DpiX y DpiY propiedades, como se muestra arriba . El CreateGraphics method de la clase de formulario hace que esto sea muy fácil de hacer; solo asegúrese de ajustar la creación de este objeto en un Using statement para evitar pérdidas de memoria. Código de ejemplo:

Dim dpiX As Single 
Dim dpiY As Single 

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

¡Hola, y gracias! Pero, ¿los ppp se relacionan con el tamaño de la pantalla (X/Y) o el tamaño de la fuente (X solo está disponible)? En otras palabras, ¿puedo estar seguro de que dpiX = dpiY en todos los casos? De lo contrario, la nueva fuente se vería estirada, ¿no? –

+0

@Didier: Sí, normalmente dpiX será equivalente a dpiY. Si no, se vería estirado. Dependerá de la resolución y de la configuración de DPI elegida por el usuario. Los ajustes pequeños predeterminados tienen dpiX = 96 y dpiY = 96. Los ajustes grandes predeterminados tienen dpiX = 120 y dpiY = 120. Puede consultar [esta página de MSDN] (http://msdn.microsoft.com/en-us/ library/dd464646.aspx) en aplicaciones de alta resolución. La [página de cómo hacer] vinculada (http://msdn.microsoft.com/en-us/library/dd464660.aspx) es excelente. –

4

Eche un vistazo a las propiedades DpiX y DpiY. Por ejemplo:

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

En VB:

Using gfx As Graphics = form.CreateGraphics() 
    userDPI = CInt(gfx.DpiX) 
End Using 
Cuestiones relacionadas