2009-02-21 14 views
9

Wie bekomme ich mein OwnerDrawn UserControl, um die Benutzer dpi (96/120/xxx) und/oder Schriftgröße (normal, groß, extra groß) zu respektieren?C# Skalieren von UserControl-Inhalten für Benutzer Dpi/Schriftgröße

Einige Leute schlagen vor, die Eigenschaften DpiX und DpiY auf einem Graphics-Objekt zu verwenden, aber das scheint mir nichts zu steuern (dh sie sind immer auf 96 gesetzt, egal welche Schriftgröße oder dpi ich wähle)).

Es gibt hier eine weitere ähnliche Frage zu StackOverflow, in der vorgeschlagen wird, die AutoScale-Eigenschaften zu verwenden, aber die vorgeschlagenen Lösungen tun auch nicht wirklich etwas.

Gibt es keine Möglichkeit, dies in .NET außer für WPF tun?

Antwort

3

Ich habe das gleiche Problem, ich habe versucht GetDC + GetDeviceCaps + ReleaseDC, außer die Verwendung von Grafiken funktioniert, mindestens Vista32. Ich bin mit DPI noch nicht erfahren, aber niemand hat das geantwortet und das könnte zumindest für andere hilfreich sein.

Auschecken Creating a DPI-Aware Application. Diese Erwähnung, warum es immer 96 zurückgibt, unabhängig von der tatsächlichen DPI-Einstellung.

Zitat von oben Link:

DPI-Skalierung in einer Win32-Anwendung

In Win32-Anwendungen, wie folgt vorgehen:

  • Verwenden Sie die SetProcessDPIAware Funktion dpi Skalierung abzubrechen.
  • Verwenden Sie bei der Dimensionierung von gezeichneten Schnittstellenelementen physische Messungen, z. B. Zentimeter. Durch die Verwendung von physischen Dimensionen anstelle von Pixeln stellen Sie eine konsistente Dimensionierung für alle Arten von Displays sicher.
  • Um die System-dpi-Einstellung zu erhalten, verwenden Sie die CDC :: GetDeviceCaps-Funktion mit dem LOGPIXELSX-Flag. Wenn Sie die dpi-Skalierung nicht abbrechen, gibt dieser Aufruf den Standardwert von 96 dpi zurück.
  • Verwenden Sie die GetSystemMetrics-Funktion, um bevorzugte Größen von Benutzeroberflächenelementen wie Fensterrahmen zu erhalten. Wenn die dpi-Skalierung deaktiviert ist, werden die Messwerte, die für die Oberflächenelemente zurückgegeben werden, auf die ausgewählte dpi-Einstellung skaliert. Wenn die dpi-Skalierung aktiv ist, gibt die Funktion unabhängig von der System-DPI-Einstellung Messungen basierend auf 96 dpi zurück.

von Beantwortet: About DPI Issue

Code Probe neu geschrieben mit mit -Anweisung (original source):

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

Sie würden die Autoscale Eigenschaft des Usercontrol auf Autoscale setzen müssen. Dpi und nicht setzen Sie die AutoScale-Eigenschaft auf True. Wenn Sie dies tun, wird der AutoScaleMode wieder auf None zurückgesetzt. Die AutoScale-Eigenschaft ist veraltet und dient nur der Abwärtskompatibilität (siehe Wichtiger Hinweis in diesem MSDN article).Wenn Sie in Windows Vista/7 nicht ausdrücklich angeben, dass Ihre Anwendung DPI-fähig ist, emuliert Windows eine Standard-DPI-Umgebung, sodass Ihre Anwendung mit 96 DPI rendert. Skalieren Sie dann die resultierende Bitmap auf die entsprechende Größe. Um dies zu vermeiden, können Sie das Anwendungsmanifest ändern, um Windows mitzuteilen, dass Sie tatsächlich DPI-fähig sind - siehe Manifest verwenden, um DPI-Awareness in this article zu deklarieren.