Erstellen einer DPI-fähigen Anwendung
Ich habe eine forms-Anwendung in C#. Wenn ich den monitor ändern der DPI, alle Steuerelemente verschieben.
Ich benutzt den code this.AutoScaleMode = AutoScaleMode.Dpi
, aber es hat nicht das problem vermeiden.
Hat jemand eine Idee?
InformationsquelleAutor der Frage RRR | 2010-11-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Wie der .NETTO 4.7, windows forms hat sich verbessert die Unterstützung für Hohe DPI. Lesen Sie mehr auf docs.microsoft.com Es funktioniert nur für Win 10 Schöpfer Update und höher, obwohl, so könnte es nicht möglich sein diese zu verwenden, doch je nach Anwenderzahl.
Schwierig, aber nicht unmöglich. Ihre beste option ist, sich zu bewegen, um WPF-natürlich, aber das ist vielleicht nicht machbar.
Habe ich VIEL Zeit verbracht mit diesem problem. Hier sind einige Regeln/Richtlinien, damit es richtig funktioniert, ohne ein FlowLayoutPanel oder TableLayoutPanel:
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); //for design in 96 DPI
Ich garantiere, dass, wenn Sie diesen Richtlinien Folgen, werden Sie in Ordnung sein, auch wenn Sie bereits platzierte Steuerelemente mit bestimmten Anker und verwenden Sie nicht ein flowpanel. Wir haben eine app gebaut auf diese Weise eingesetzt, die auf Hunderten von Maschinen mit unterschiedlichen DPI-Einstellungen und wir haben nicht mehr Beschwerden. Alle Formen/Behältern/raster/Taster/textfield etc Größen sind richtig skaliert, da ist die Schrift. Bilder auch funktionieren, aber Sie neigen dazu, ein wenig pixellated bei hohem DPI-Wert.
EDIT: Dieser link hat viele gute Infos, vor allem, wenn Sie wählen, um AutoScaleMode.DPI: link zu verwandten stackoverflow-Frage
InformationsquelleAutor der Antwort Trygve
Fand ich schließlich eine Lösung für das problem sowohl der Ausrichtung des Bildschirms, und DPI-handling.
Microsoft hat bereits ein Dokument, das es aber mit einem kleinen Mangel, den man töten DPI-handling komplett.
Folgen Sie einfach die Lösung in das Dokument unten unter "Erstellen von Separaten Layout-Code für Jede Orientierung"
http://msdn.microsoft.com/en-us/library/ms838174.aspx
Dann WICHTIGE Teil!!!!
In dem code für die Landschaft() und Porträt () - Methoden, die am Ende eines jeden fügen Sie diese Zeilen:
So, den code für diese 2 Methoden werden wie:
Funktioniert wie Charme für mich.
InformationsquelleAutor der Antwort
Wie es aussieht wird das ein problem mit Windows. Nehmen Sie sich diese zwei Zeilen fixiert alles.
Dies ist, wo ich die Lösung:
InformationsquelleAutor der Antwort Jakobitz
Es ist wirklich schwer zu design DPI aware Anwendungen in Windows Forms. Sie müssten layout-Container, die Größe richtig, wenn der DPI-Wert geändert wird (z.B. TableLayoutPanel oder FlowLayoutPanel). Alle Bedienelemente müssen, ändern der Größe als auch. Die Konfiguration dieser Container kann eine Herausforderung sein.
Für einfache Anwendungen, es kann getan werden, innerhalb einer angemessenen Höhe der Zeit, aber für große Anwendungen ist es wirklich viel Arbeit.
InformationsquelleAutor der Antwort testalino
ScaleByDPI Funktion erhalten-Control-Parameters, ist in der Regel ein Formular, und als rekursiv Durchlaufen und alle sub-regler (if (Kontrolle.HasChildren == true)), und der scale-location und Größen aus Ihrer Anwendung Steuerelemente & Größen und Größen der fonts das OS konfiguriert DPI. Sie können versuchen, es zu implementieren, auch für Bilder, Symbole & Grafik.
Besondere Hinweise für ScaleByDPI Funktion:
ein. Für alle Steuerungen mit Standard-Schriftart, die Größen, die Sie benötigen, um Ihre Schriftart.Größe 8.25.
b. Sie können erhalten devicePixelRatioX und devicePixelRatioY Werte (Kontrolle.CreateGraphics().DpiX /96) und (- Kontrolle.CreateGraphics().DpiY /96).
c. Sie benötigen Skala Kontrolle.Größe & Steuern.Lage, die durch Algorithmus basiert auf Kontrolle.Dock & Steuern.Anker-Werte. Bemerkt werden, dass die Kontrolle.Dock kann 1 von 6 möglichen Werten, Steuern.Anker kann 1 von 16 möglichen Werte.
d. dieser Algorithmus braucht Werte, um weiter bool-Variablen isDoSizeWidth, isDoSizeHeight, isDoLocationX, isDoLocationY, isDoRefactorSizeWidth, isDoRefactorSizeHeight, isDoRefactorLocationX, isDoRefactorLocationY, isDoClacLocationXBasedOnRight, isDoClacLocationYBasedOnBottom.
e. Wenn Ihr Projekt verwendet einen Steuerelement-Bibliothek anderen dann Microsoft kontrolliert, diese Kontrollen benötigen eine Besondere Behandlung.
Mehr Infos auf oben (d.) bool-Variablen:
*Manchmal ist eine Gruppe von Steuerelementen (kann ein buttons) platziert werden müssen, eine nach der anderen, die auf derselben vertikalen Linie, und Ihrer Anker-Wert umfassen Rechts, aber nicht Links, oder müssen Sie platziert werden, eine nach der anderen, die auf derselben horizontalen Linie, und Ihrer Anker-Wert umfassen Unten, aber nicht Oben, in diesem Fall müssen Sie neu zu berechnen, Kontrollen Position Werte.
*Im Fall von Steuerelementen, die den Anker enthält Oben & Unten und\oder Links & Rechts, Sie benötigen, um re-Faktor steuert die Größe & Lage Werte.
Verwendet ScaleByDPI Funktion:
ein. Fügen Sie folgenden Befehl, um die end-off irgendeiner Form Konstruktor: ScaleByDPI(this);
b. Auch beim hinzufügen jedes Steuerelement dynamisch zu einem Formular Aufruf ScaleByDPI([Steuerelementname]).
Wenn Sie die Größe oder Position eines Steuerelements dynamisch nach Konstruktor beendet, erstellen und verwenden Sie eine der folgenden Funktionen, um die skalierten Werte der Größe oder Lage: ScaleByDPI_X \ ScaleByDPI_Y \ ScaleByDPI_Size \ ScaleByDPI_Point
Damit markieren Sie Ihre Anwendung als DPI-aware, fügen Sie die dpiAware element, um Ihre Anwendung Assemblymanifest.
Set GraphicsUnit aller Steuern.Schriftart System.Zeichnung.GraphicsUnit.Punkt
*.Designer.cs-Dateien aller Container setzen AutoScaleMode Wert auf System.Windows.Formen.AutoScaleMode.Keine
in Steuerelemente wie "ComboBox" & TextBox ändern Kontrolle.Größe.Hieght keine Auswirkungen haben. In diesem Fall ändern Kontrolle.Font.Größe beheben wird, kontrollieren Sie die Höhe.
Wenn form StartPosition Wert FormStartPosition.CenterScreen, werden Sie brauchen, um eine Neuberechnung der Position der Fenster.
InformationsquelleAutor der Antwort Yossi B
Aus Erfahrung:
AutoScaleMode
EigenschaftNone
auf alle Formulare und Steuerelemente in Ihrer appInformationsquelleAutor der Antwort Liviu M.
Seit einer Winform-Anwendung form-Inhalt-Steuerelemente UND Bilder, so dass Sie das system ändern Sie die Größe der Fenster ist KEINE Lösung, aber wenn könnten Sie verwalten, um ein Formular pro DPI Auflösung, mit richtig skalierten Bilder... Und das ist keine gute Idee, da die Display-Größe wachsen, die Schriftgröße abnimmt.
Wenn mit einem anderen DPI-Auflösung, die das system zwingt, Ihre form neu zu definieren, die sich seiner Kontrolle die Größe, Position und schriftart, ABER NICHT die BILDER, die Lösung ist das ändern der form des DPI zur Laufzeit beim laden, so dass alles wieder auf original Größe und Lage.
Dies ist mögliche Lösung, die ich getestet habe, es mit einem Karten-Spiel-Anwendung, wo habe ich gott etwa 80 Bild-Tasten, TabControls etc.
In jeder form form_Load-Ereignis, fügen Sie das code-snippet:
Außerdem einen schnellen trick zum testen verschiedener Auflösungen auf demselben PC ohne Neustart:
In der Systemsteuerung, ändern Sie die Auflösung.
Nicht neu starten! Stattdessen schließen Sie Ihre Sitzung und öffnet eine neue mit dem gleichen Benutzer.
Gibt es eine andere Einschränkung: Wenn Sie ein Steuerelement die Größe und position zur Laufzeit, dann sollten Sie in der gleichen DPI-Faktor (zB. 125 /Dpi.Dpix) zu den neuen Koordinaten. So würden Sie besser eingerichtet DPIFactor Globale variable von der Anwendung.startup-Ereignis.
Last but not least:
NICHT öffnen Sie die Anwendung in Visual Studio aus einer anderen Auflösung als das original, oder ALLE STEUERELEMENTE verschieben und skalieren, wie Sie Sie öffnen jede form, und es gibt keinen Weg zurück...
Hoffe, das hilft, glücklich zu Programmieren.
InformationsquelleAutor der Antwort Didier Levy