UserForm / verschiedene Desktop-Auflösungen berücksichtigen

  • Excel

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von mumpel.

    UserForm / verschiedene Desktop-Auflösungen berücksichtigen

    Hallo!

    Ich habe in Excel mehrere UserForms.
    Bei mir auf dem "Entwicklungs-"Rechner habe ich eine Auflösung von 2560 x 1440.
    Wenn ich aber nun meine Excel-Mappe auf nem Laptop mit nur 1024 x 768 px laufen lasse sind die UserForms recht überdimensioniert!

    Ich hab jetzt schon nach Umrechnungsmethoden gesucht und bin jetzt dabei das Auflösungs-Verhältnis zu berechnen.

    Seitenverhältnis: 1,77777777777778 bei Auflösung von 2560 x 1440
    Seitenverhältnis: 1,33333333333333 bei Auflösung von 1024 x 768

    Jetzt muss ich irgendwie die Form und jedes Control mit dem Seitenverhältnisfaktor bearbeiten..
    ..hat da schonmal jemand sowas gemacht?

    Ich bediene mich der GetSystemMetrics Funktion aus der user32-Lib um an die aktuelle Auflösung zu kommen.

    GetSystemMetrics:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Public Const SM_CXSCREEN = 0
    2. Public Const SM_CYSCREEN = 1
    3. Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long



    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub testForm()
    2. Dim FormControl As MSForms.Control
    3. Dim X_SizeCoefficient As Double
    4. Dim Y_SizeCoefficient As Double
    5. '2560 x 1440
    6. Dim X_Resol_Std As Long '100 % Standard-Auflösung / Horizontal / 2560
    7. Dim Y_Resol_Std As Long '100 % Standard-Auflösung / Vertikal / 1440
    8. Dim X_Resol As Long 'ausgelesene Auflösung / Horizontal
    9. Dim Y_Resol As Long 'ausgelesene Auflösung / Vertikal
    10. ' X_Resol_Std = 2560
    11. ' Y_Resol_Std = 1440
    12. X_Resol_Std = 1024
    13. Y_Resol_Std = 768
    14. X_Resol = GetSystemMetrics(SM_CXSCREEN)
    15. Y_Resol = GetSystemMetrics(SM_CYSCREEN)
    16. Debug.Print ("Breite: " & X_Resol & " x Höhe: " & Y_Resol)
    17. Debug.Print ("Seitenverhältnis: " & X_Resol / Y_Resol)
    18. Debug.Print ("Seitenverhältnis: " & X_Resol_Std / Y_Resol_Std)
    19. X_SizeCoefficient = X_Resol * 100 / X_Resol_Std
    20. Y_SizeCoefficient = Y_Resol * 100 / Y_Resol_Std
    21. Debug.Print (X_SizeCoefficient & " x " & Y_SizeCoefficient)
    22. ' SizeCoefficient = 1 'inputNumber("Scale Factor: ", "Form", 1)
    23. '
    24. '
    25. ' With Me
    26. ' .Top = .Top * SizeCoefficient
    27. ' .Left = .Left * SizeCoefficient
    28. ' .Width = .Width * SizeCoefficient
    29. ' .Height = .Height * SizeCoefficient
    30. ' End With
    31. ' For Each FormControl In Me.Controls
    32. ' With FormControl
    33. ' .Top = .Top * SizeCoefficient
    34. ' .Left = .Left * SizeCoefficient
    35. ' .Width = .Width * SizeCoefficient
    36. ' .Height = .Height * SizeCoefficient
    37. '
    38. ' On Error Resume Next
    39. ' .Font.Size = .Font.Size * SizeCoefficient
    40. ' On Error GoTo 0
    41. ' End With
    42. ' Next FormControl
    43. End Sub
    44. Private Function inputNumber(prompt As String, title As String, defValue As Variant) As Variant
    45. inputNumber = Application.InputBox(prompt, title, defValue, , , , , 1)
    46. End Function

    Ich würde eine Minimalgröße zur Entwurfszeit definieren (irgendwann ist es schließlich klein genug bzw. zu klein) und ab da nur noch vergrößern. Und zwar im Form_Resize()-Ereignis. Gemacht habe ich sowas schon häufig.

    Standardmäßig würde ich die Forms beim 1. Programmstart entweder auf Vollbild oder auf x % der X- und Y-Auflösung setzen (z. B. jeweils 50 %). Das Seitenverhältnis spielt eigentlich keine Rolle.

    Bestimmte Dinge würde ich aber eher nicht verändern, z. B. Buttons. Nur solche DInge, bei denen mehr Platz sinnvoll ist, z. B. mehrzeilige Textboxen, Listviews usw.

    Nachtrag: Wenn du nur solche Dinge auf der Form hast, bei denen eine (vertikale) Größenänderung eigentlich nicht sinnvoll ist (z. B. einfach nur ein riesiges Eingabeformular mit Single-Line-Textboxen), dann ist diese wohl zu voll und du solltest diese in andere Forms oder besser in Tabs (Tabcontrol) auslagern. Oder du arbeitest einfach mit Scrollbars.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Morrison schrieb:

    mit nur 1024 x 768 px

    Wer hat noch so kleine Auflösungen?

    Aber meiner Erfahrung nach nützt eine Skalierung nicht immer. Ich habe es schon erlebt, dass die Userform durch Skalierung trotzdem nicht gut nutzbar ist. Wenn ein Desktop-Monitor die selbe Auflösung hat wie der Notebook-Monitor, sieht es am Notebook trotzdem nicht gut aus. Alles wird kleiner, da die Pixel, im Vergleich zum Desktop-Monitor, auf dem Notebook-Bildschirm quasi zusammengequetscht sind (Die selbe Auflösung auf einer viel kleineren Fläche). Erst recht wenn der Notebook-Bildschirm eine höhere Auflösung hat. Das kann passieren, muss aber nicht. Daher, wie Marcus schon vorgeschlagen hat, besser mit Multiseiten arbeiten.

    Im Übrigen muss man nicht nur die Bildschirmauflösung berücksichtigen, sondern auch die Skalierung. Mein Notebook-Bildschirm hat die selbe Auflsöung wie mein Desktop-Monitor. Aber die Userform passt am Notebook trotzdem nicht komplett drauf, weil ich am Notebook 125% Skalierung einstellen muss, weil bei 100% alles viel zu klein ist (Ist aber m.E. logisch. Auf 12" die Auflösung eines 24-Zöllers. Das kann ja am 12-Zoll-Notebook-Bildschirm nicht genauso aussehen wie am 24-Zoll-Desktop-Monitor).

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