Hi,
ich habe DPI Aware erfolgreich getestet. Melde ich mich in Win10 nur mit einem Monitor an, startet die Winforms App wie gewollt:
Auf 1k/100% scaling mit 96dpi
Auf 4k/300% scaling mit 288dpi
Soweit so cool.
Jetzt will ich die App so haben, dass sie auf dem Monitor auf dem sie startet richtig skaliert.
Ist mein Hauptbildschirm der 4k Monitor, dann startet die App auf dem 4k Monitor richtig mit 288dpi. Start ich die App aber auf dem 1k Monitor, benutzt sie leider auch 288dpi, was falsch ist.
Die Form.Scale(...) Methode hab ich nach InitializeComponent() getestet, funktioniert aber nicht wie gewollt.
Was muss ich tun, damit die App auf dem 1k Monitor mit 96dpi startet?
Hallo Chevy77,
dies sollte mit Hilfe folgender Einstellungen funktionieren:
Setting the default DPI awareness for a process
Unsere Anwendung wechselt automatisch die Skalierung je nach Monitor, auch im laufenden Betrieb, wenn man sie zwischen den Monitoren verschiebt, sobald du
<dpiAwareness>PerMonitor</dpiAwareness>
festlegst.
Grüße
spooky
Ich habe das in der App Config, es skaliert auch zum App Launch, aber nicht "on the fly" zB beim Fenster auf einen anderen Monitor ziehen.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
</configuration>
Bei mir sieht der Eintrag wie folgt aus:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitor</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
Versuche es mal damit.
Deine Settings sind in der Manifest Datei und die überschreiben die App.config.
Laut MSDN soll man es per App.config machen, wie ich also.
Und Dein Betriebssystem erfüllt auch die dokumentierten Anforderungen, wie zB. die OS Version? Ebenso Configuring your Windows Forms app for high DPI support beachtet?
Das übersehen die meisten...
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Chevy77,
ich habe mich damals an dieses Dokument gehalten.
Beim Überfliegen dieses finde ich diesen Abschnitt:
We recommended that you specify the default process DPI awareness via a manifest setting.
Ich kann nur sagen, dass es mit diesen Werten funktioniert (unter Windows 10 1809).
Grüße
Meine Anleitung von 2017
https://docs.microsoft.com/de-de/dotnet/framework/winforms/high-dpi-support-in-windows-forms
"Enable per-monitor DPI awareness in the app.config file."
Dieses Beispiel hat mir geholfen meine Testanwendung perMonitorV2 aware zur Laufzeit zu machen:
https://emoacht.wordpress.com/2013/10/30/per-monitor-dpi-aware-in-windows-forms/
Ich habe,
das Form designed in 96px mit einer Breite von 960px.
Wenn ich es auf den 4k Monitor verschiebe ist es 2140px breit.
2140/960 = ~2,2
Der Me.Scale Faktor ist aber 1,5.
Wie kommt es zu diesem Unterschied?
DPI.Scaling Methode Font und:
Private Sub AdjustWindow()
If (_dpi = 0) OrElse (_dpi = _dpiNew) Then Exit Sub 'Abort.
Dim factor As Single = _dpiNew / _dpi
_dpi = _dpiNew
'Adjust location and size of Controls (except location of this window itself).
Me.Scale(New SizeF(factor, factor))
'Me.Scale(factor)
'Adjust Font size of Controls.
Me.Font = New Font(Me.Font.FontFamily,
Me.Font.Size * factor,
Me.Font.Style)
'Adjust Font size of Buttons.
'(Each Font is individually specified at design time)
For Each b As Button In GetChildInControl(Me).OfType(Of Button)()
b.Font = New Font(b.Font.FontFamily,
b.Font.Size * factor,
b.Font.Style)
Next
For Each c As CheckBox In GetChildInControl(Me).OfType(Of CheckBox)()
If c.Name = "CheckBox2" Then
c.Font = New Font(c.Font.FontFamily,
c.Font.Size * factor,
c.Font.Style)
End If
Next
For Each l As Label In GetChildInControl(Me).OfType(Of Label)()
l.Font = New Font(l.Font.FontFamily,
l.Font.Size * factor,
l.Font.Style)
If l.Image IsNot Nothing Then
l.Image = Resize(l.Image, l.Image.Width * factor, l.Image.Height * factor)
End If
Next
End Sub
Hello again! Lebt hier noch jemand?! Alles cool, hat sich nur eine neue Frage aufgetan zu dem Thema:
In den Projekteigenschaften eines WinForms Projektes gibt es den Schalter "Enable Application Framework". Leider können wir den nicht aktivieren, da wir dann ordenlich den Start unser Anwendung umprogrammieren müssen. Das kriegt hier keiner sicher hin, ist meine Unterstellung.