2009-02-21 7 views
9

¿Cómo hago para que UserDrawn UserControl respete los ppp (96/120/xxx) y/o el tamaño de fuente (normal, grande, extra grande)?C# Escalado UserControl contenido para que coincida con usuarios Dpi/Tamaño de fuente

Algunas personas sugieren utilizar las propiedades DpiX y DpiY en un objeto Graphics, pero eso no parece tener nada bajo mi control (es decir, siempre se establecen en 96, independientemente del tamaño de letra o ppp que elija)

Hay otra pregunta similar aquí en StackOverflow en la que sugiere utilizar las propiedades AutoScale, pero las soluciones sugeridas tampoco hacen nada realmente.

¿No hay forma de hacerlo en .NET a excepción de confiar en WPF?

Respuesta

3

Tengo el mismo problema, traté de usar GetDC + GetDeviceCaps + ReleaseDC, excepto que usé Graphics works, al menos en Vista32. Todavía no tengo experiencia con DPI, pero nadie respondió esto y al menos esto podría ser útil para otros.

Consulte Creating a DPI-Aware Application. Esta mención explica por qué siempre puede devolver 96 independientemente de la configuración real de PPP.

Presupuesto de enlace de arriba:

escala DPI en una aplicación Win32

En las aplicaciones Win32, haga lo siguiente:

  • Utilice la función SetProcessDPIAware para cancelar dpi escala.
  • Al dimensionar los elementos de la interfaz dibujada, use medidas físicas, como centímetros. Al usar las dimensiones físicas en lugar de los píxeles, garantiza un dimensionamiento uniforme en todos los tipos de pantallas.
  • Para obtener la configuración de ppp del sistema, use la función CDC :: GetDeviceCaps con el indicador LOGPIXELSX. Si no cancela la escala de ppp, esta llamada devuelve el valor predeterminado de 96 ppp.
  • Utilice la función GetSystemMetrics para obtener los tamaños preferidos de los elementos de la interfaz de usuario, como los bordes de las ventanas. Cuando la escala de dpi está desactivada, los valores de medición que se devuelven para los elementos de la interfaz se ajustan a la configuración de ppp seleccionada. Si la escala de dpi está activa, la función devuelve las medidas basadas en 96 ppp, independientemente de la configuración de ppp del sistema.

respondió desde: Código About DPI Issue

Muestra reescrito con el uso de -statement (original source):

float dpiX = 96, dpiY = 96; 
using(Graphics graphics = this.CreateGraphics()) 
{ 
    dpiX = graphics.DpiX; 
    dpiY = graphics.DpiY; 
} 
11

Usted tendría que establecer la propiedad AutoScaleMode del control de usuario a AutoScaleMode. Dpi y no establecen la propiedad AutoScale en verdadero. Si lo hace, restablecerá AutoScaleMode en None. La propiedad AutoScale está obsoleta y solo está disponible para compatibilidad con versiones anteriores (consulte Nota importante en este MSDN article).También, en Windows Vista/7, a menos que especifique explícitamente que su aplicación es compatible con DPI, Windows emulará un entorno PPP predeterminado para que su aplicación renderice con 96 ppp, luego escalará el mapa de bits resultante al tamaño apropiado. Para evitar eso, puede modificar el manifiesto de su aplicación para informar a Windows de que en realidad está consciente de DPI: consulte el Uso del manifiesto para declarar la sección de conocimiento de DPI en this article.

Cuestiones relacionadas