PictureBox skalieren in verschieden Auflösungen

  • VB.NET

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

    PictureBox skalieren in verschieden Auflösungen

    Nabend!

    Und wieder eine Frage:
    Ich würde gerne mehrere PictureBoxen haben, die je nach der Größe des Bildschirms sich skalieren. Nur habe ich leider bisher noch nicht den passenden Wert gefunden! Oder muss ich das ganze per Code lösen?

    Das Beispiel:
    Ein großer Tisch, auf diesem sollen 5 Karten ( Bilder in den PictureBoxen ) gelegt werden. Das ganze läuft im "Vollbildmodus". Da verschiedene Leute verschiedene Auflösungen haben hätten einige an den Rändern einen großen Bereich voller nichts, bei anderen grenzen die Bilder bis an den Bildschirmrand. Was tun?

    :thumbsup:
    jo da binn ich auch grade drann,habe folgendes gefunden !


    Skalieren

    Größe und Position von Formen und Steuerelementen
    an unterschiedliche Bildschirmauflösungen anpassen.

    Hat der Rechner auf dem ein Programm abläuft eine andere Bildschirmauflösung als der Rechner auf dem das Programm erstellt wurde, so werden Formen und Steuerelemente auf den beiden Rechnern unterschiedlich groß dargestellt.

    Ein Programm "xyz" wird z.B. auf einem Rechner mit einer aktuellen Bildschirmauflösung von 800 * 600 Pixel erstellt.
    Wird dieses Programm jetzt auf einem Rechner mit einer höheren Auflösung (z.B. 1024 * 768) installiert, so werden ohne besondere Vorkehrungen im Programm alle Fenster und Steuerelemente deutlich kleiner als auf dem Entwicklungsrechner dargestellt. Dies könnte in vielen Fällen noch toleriert werden. Unangenehmer wird es aber, wenn der Rechner auf dem das Programm laufen soll eine niedrigere Bildschirmauflösung (z.B. 640 * 480) benutzt. Jetzt werden Fenster und Steuerelemente größer als auf dem Entwicklungsrechner abgebildet. Dies hat zur Folge, dass ein Fenster möglicherweise größer als die tatsächliche Bildschirmfläche wird und einige Steuerelemente der Form gar nicht mehr sichtbar sind. Dies wird sicher kein Anwender tolerieren.

    Das Programm sollte also prüfen, mit welcher tatsächlichen Auflösung gearbeitet wird und Grösse und Position von Formen und Steuerelementen entsprechend anpassen.

    Die Sub "Skalieren" im folgenden Programmausschnitt sorgt dafür, dass ein Programm unabhängig von der jeweiligen Bildschirmauflösung wird.

    Die Werte für die Konstanten
    DWidth ( = Screen.Width) und
    DHeight ( = Screen.Height)
    müssen am Entwicklungsrechner zur Designzeit ermittelt werden.

    Beim SSTab gibt es eine Besonderheit.
    Für Controls die auf einem momentan nicht sichtbaren Tab liegen wird von der tatsächlichen Left-Eigenschaft ein fester Wert von 75000 (Twips) abgezogen.
    D.h. ein Control, das auf einem gerade sichtbaren Tab auf Control.Left = 1000 liegt, erhält in dem Moment in dem das Tab unsichtbar wird (durch Userklick oder durch Code) Control.Left = -74000.
    Beim Skalieren muss man also abfragen, ob 1. der Container des Controls ein SSTab ist und ob 2. die Left-Eigenschaft < 0 ist. Sind beide Bedingungen erfüllt, dann muss der Wert für Left entsprechend korrigiert werden.

    Ebenso müssen Controls die sich auf einem Toolbarcontrol befinden gesondert behandelt werden. Toolbarcontrols haben feste Werte für z.B. ButtonHeigth, ButtonWidth. Textfelder oder andere Controls, die sich auf einem Toolbarcontrol befinden, werden deshalb sinnvollerweise nach dem Skalieren der Form getrennt an der gewünschten Stelle eingepasst.

    Public Sub Skalieren(FRM As Form, ScaleForm As Boolean, ScaleFont As Boolean)
    'Skaliert alle Elemente der übergebenen Form
    'Elemente in Toolbars müssen separat ausgerichtet werden, da Toolbar nicht skaliert wird

    VB.NET-Quellcode

    1. Dim I As Integer
    2. Dim K As Long
    3. Dim SFX As Single
    4. Dim SFY As Single
    5. Const DWidth = 12000 'Screen.Width zur Designzeit
    6. Const DHeight = 9000 'Screen.Height zur Designzeit
    7. SFX = Screen.Width / DWidth 'Skalierfaktor X-Achse
    8. SFY = Screen.Height / DHeight 'Skalierfaktor Y_Achse
    9. On Error Resume Next
    10. If ScaleForm Then
    11. FRM.Width = FRM.Width * SFX
    12. FRM.Height = FRM.Height * SFY
    13. FRM.Left = FRM.Left * SFX
    14. FRM.Top = FRM.Top * SFY
    15. End If
    16. For I = 0 To FRM.Controls.Count - 1
    17. 'nur wenn ein Toolbarcontrol auf der Form ist
    18. ' If Not TypeOf FRM.Controls(I).Container Is Toolbar Then
    19. 'diese Routine wird nur benötigt, wenn sich auf der Form ein SSTab befindet.
    20. If TypeOf FRM.Controls(I).Container Is SSTab Then
    21. If FRM.Controls(I).Left < 0 Then
    22. K = 75000
    23. End If
    24. End If
    25. 'wenn die vorstehende Routine für SSTab verwendet wird
    26. FRM.Controls(I).Left = ((FRM.Controls(I).Left + K) * SFX) - K
    27. 'wenn die obige Routine für SSTab nicht verwendet wird
    28. 'FRM.Controls(I).Left = FRM.Controls(I).Left * SFX
    29. FRM.Controls(I).Top = FRM.Controls(I).Top * SFY
    30. FRM.Controls(I).Width = FRM.Controls(I).Width * SFX
    31. FRM.Controls(I).Height = FRM.Controls(I).Height * SFY
    32. If ScaleFont Then
    33. FRM.Controls(I).Font.Size = FRM.Controls(I).Font.Size * SFY
    34. FRM.Controls(I).HeadFont.Size = FRM.Controls(I).HeadFont.Size * SFY
    35. End If
    36. K = 0
    37. 'nur wenn ein Toolbarcontrol auf der Form ist
    38. ' End If
    39. Next I
    40. On Error GoTo 0
    41. End Sub



    Die Sub wird z.B. im Form_Load - Ereignis so aufgerufen

    Skalieren Me, True, True

    Der Aufruf bewirkt dass alle Controls auf der Form, die Form selbst und die Fontgrößen skaliert werden.

    Wurde die Eigenschaft WindowState der Form zur Designzeit bereits auf vbMaximized eingestellt so ist das Skalieren der Form selbst nicht sinnvoll.
    Die Sub wird dann z.B. so aufgerufen:

    Skalieren Me, False, True


    Die Einstellung der Werte für .Left, .Top, .Width, .Height kann nicht ohne weiteres in einer "Move Left, Top, Width, Height" - Anweisung zusammengefasst werden. Befinden sich auf der Form Steuerelemente, bei denen eine der Eigenschaften Left, Top, Width oder Height nicht einstellbar ist, so würde wegen "On Error Resume Next" die gesamte Anweisung übergangen. D.h. es würde keine Positionierung bzw. Skalierung für dieses Steuerelement durchgeführt.

    Befinden sich auf der Form Liniensteuerelemente (Line) so müssen die jeweiligen X- und Y- Koordinaten ebenfalls in die Skalierung mit einbezogen werden.
    Line1.X1 = Line1.X1 * SFX
    Line1.X2 = Line1.X2 * SFX
    Line1.Y1 = LIne1.Y1 * SFX
    Line1.Y2 = LIne1.Y2 * SFY

    VIEL SPAß ; ICH GEBS MIR MORGEN :D
    Ich frage mich, wofürs so praktische Dingers wie TablePanels und Anchor-Eigenschaftens gibt. ...
    Achja, und GDI mit Klassen von Spielobjekten, dioe sich selber zeichnen zu können in der Lage sind.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: