Größe an Bildschirmauflösung anpassen durch Zoom?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von us4711.

    Größe an Bildschirmauflösung anpassen durch Zoom?

    Hallo,

    ich habe in meinem Projekt eine Form, die das allgemein bekannte Problem der fehlenden Skalierung besitzt. Bei mir gilt folgender Sonderfall: Meine Form ist in zwei Teile gegliedert, zu jeder Seite können unterschiedliche Panels eingeblendet werden. Diese werden mit einer sehr komplexen Animation "hereingeflogen". Daher funktioniert die Funktion ANCHOR UND DOCK NICHT. Es verschieben sich zwar alle Randelemente hervorragend, jedoch müsste ich ja aber die Animationen für jede Bildschirmauflösung anpassen. Gibt es also eine andere Möglichkeit? Ich dachte da an eine Art Zoom, bei der einfach alles vergrößert wird (bei höherer Bildschirmauflösung) ohne dass etwas verschoben werden oder neu skaliert werden muss... Gibt es sowas?

    Außerdem: Auf meinem Windows-Tablet ist standardmäßig in den Einstellungen ein gewisser Zoom eingestellt (150 %), inwiefern verfälscht dieser denn Bildschirmauflösung usw.? Also bleibt die Auflösung gleich (klar, irgendwie bleibt das Bild ja trotzdem genauso scharf)? Aber was ist die "offizielle" Angabe, die dann dem Programm mit der Eigenschaft WorkingArea weitergegeben wird? Vielleicht könnte man sich diese Beobachtung dann auch oben zu Nutzen machen?!

    Vielen Dank und schönen Abend

    Felix
    Ich verstehe deine Frage nicht ganz, du möchtest je nach auflösung die animation anpassen bzw. die form zoomen?

    Animiertst du den die Controls mit Code oder einer vorgefertigten Funktion/Lib?

    Luca
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.

    felix schrieb:

    mit einer sehr komplexen Animation "hereingeflogen"
    Kannst Du das etwas näher erläutern?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du könntest eventuell

    Quellcode

    1. Me.AutoScaleMode = Windows.Forms.AutoScaleMode.Font
    oder

    Quellcode

    1. Me.AutoScaleMode = Windows.Forms.AutoScaleMode.dpi
    benutzen und dann ggf. die font-size der form ändern.


    Grüße
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
    Ich hatte vor einiger Zeit ein ähnliches Problem: Parallel zur Anzeige auf dem Hauptbildschirm sollte eine weitere Form auf einem zweiten Bildschirm dargestellt werden. Dieser 2. Bildschirm ist über HDMI angeschlossen, und kann ein Display, ein Fernseher , ein Notebook oder ein Beamer sein. Alle diese Zweitdisplays haben unterschiedliche Auflösungen.
    Die weitere Form ist recht komplex, mit Panels, Labels etc. mit unterschiedlichen Fonts.
    Der nachfolgende Code ist für mich ausreichend:

    VB.NET-Quellcode

    1. Public Class Helper
    2. Public Shared Sub ScaleToScreen(FormToResize As Form, ScreenNumber As Int32)
    3. Dim m_screen As Screen
    4. If Screen.AllScreens.Length > ScreenNumber Then
    5. m_screen = Screen.AllScreens(ScreenNumber)
    6. Else
    7. m_screen = Screen.AllScreens(0)
    8. ScreenNumber = 0
    9. End If
    10. ' Set the StartPosition to Manual otherwise the system will assign an automatic start position
    11. FormToResize.StartPosition = FormStartPosition.Manual
    12. FormToResize.AutoScaleMode = AutoScaleMode.None
    13. '
    14. ' Set the form location so it appears at Location (0, 0) on the screen 1
    15. '
    16. FormToResize.Location = m_screen.Bounds.Location
    17. Dim NewX As Integer = m_screen.Bounds.Width
    18. Dim NewY As Integer = m_screen.Bounds.Height
    19. Dim FactorX = NewX / FormToResize.Width
    20. Dim FactorY = NewY / FormToResize.Height
    21. ScaleRecursive(FormToResize, FactorX, FactorY)
    22. End Sub
    23. Private Shared Sub ScaleRecursive(ParentControl As Control, FactorX As Double, FactorY As Double)
    24. Dim NewLocation = New Point(CInt(ParentControl.Location.X * FactorX), CInt(ParentControl.Location.Y * FactorY))
    25. ParentControl.Location = NewLocation
    26. Dim NewFontHeight As Single = CSng(ParentControl.Font.SizeInPoints * FactorY)
    27. ParentControl.Font = New Font(ParentControl.Font.Name, NewFontHeight, ParentControl.Font.Style)
    28. Dim NewSize = New Size(CInt(ParentControl.Width * FactorX), CInt(ParentControl.Height * FactorY))
    29. ParentControl.Size = NewSize
    30. For Each ChildControl As Control In ParentControl.Controls
    31. ScaleRecursive(ChildControl, FactorX, FactorY)
    32. Next
    33. End Sub
    34. End Class

    //Edit:
    Ich vergass anzumerken, dass der Aufruf im Form.Shown Event erfolgen sollte:

    VB.NET-Quellcode

    1. Helper.ScaleToScreen(me,ScreenNumber)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „us4711“ ()