Laden...

DPI Scaling Multi Resolutions and DPI Settings

Erstellt von Chevy77 vor 4 Jahren Letzter Beitrag vor 4 Jahren 3.442 Views
C
Chevy77 Themenstarter:in
39 Beiträge seit 2018
vor 4 Jahren
DPI Scaling Multi Resolutions and DPI Settings

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?

S
248 Beiträge seit 2008
vor 4 Jahren

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

C
Chevy77 Themenstarter:in
39 Beiträge seit 2018
vor 4 Jahren

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>
S
248 Beiträge seit 2008
vor 4 Jahren

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.

C
Chevy77 Themenstarter:in
39 Beiträge seit 2018
vor 4 Jahren

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.

16.807 Beiträge seit 2008
vor 4 Jahren

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...

S
248 Beiträge seit 2008
vor 4 Jahren

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

C
Chevy77 Themenstarter:in
39 Beiträge seit 2018
vor 4 Jahren

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/

C
Chevy77 Themenstarter:in
39 Beiträge seit 2018
vor 4 Jahren

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

C
Chevy77 Themenstarter:in
39 Beiträge seit 2018
vor 4 Jahren

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.

  1. Was macht dieser Haken? Google hilft mir nicht.
  2. Wenn ich den abgehakt habe, gelten die dpi Settings aus der app.config nicht. Ich könnte dann zwar per shared sub main und api Funktionen den dpi mode ändern, aber das geht bei uns auch nicht bis zum Ende, weil wir kein "Application.Run(new FormX) haben. Ohne das, schaltet der mode auch nicht um. (Seit April sieht man den dpi mode im Taskmanager, man muss die Spalte dort einfügen)
C
Chevy77 Themenstarter:in
39 Beiträge seit 2018
vor 4 Jahren

sehr geil, danke das hab ich gebraucht.