Code Verständnisproblem

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Code Verständnisproblem

    Hallo,

    ich bin zur Zeit dabei mein Programm für jede Bildschirmauflösung richtig zu skalieren und habe im Internet folgenen Code gefunden:

    VB.NET-Quellcode

    1. Public Sub SetDeviceIndependentWindow(ByVal ParamArray FormNamen As Form())
    2. ' Im Prozeduraufruf muss die zu ändernde Userform angegeben werden
    3. Dim HeightChange, WidthChange As Integer
    4. ' Skalierungsfaktor der aktuellen Auflösung
    5. ' In Bezug auf die ursprüngliche Auflösung
    6. X = (Screen.PrimaryScreen.Bounds.Width / X_RESOLUTION)
    7. Y = (Screen.PrimaryScreen.Bounds.Height / Y_RESOLUTION)
    8. ' Keine Neuanordung bei identischer Auflösung
    9. If X = 1 And Y = 1 Then Exit Sub
    10. For Each formname As Form In FormNamen
    11. ' Neue Abmessung der Userform berechnen
    12. formname.Height = CInt(formname.Height * Y)
    13. formname.Width = CInt(formname.Width * X)
    14. ' Userform neu positionieren
    15. formname.Left = formname.Left - CInt(WidthChange / 2)
    16. formname.Top = formname.Top - CInt(HeightChange / 2)
    17. ' Alle Controls durchlaufen und ändern
    18. For Each ctl As Control In formname.Controls
    19. CtlLoop(ctl)
    20. Next ctl
    21. Next formname
    22. End Sub


    Jetzt ist mir allerdings nicht ganz bewusst, wofür er die Variablen "WidthChange" und "HeightChange" deklariert, wenn er ihnen keine Werte zuweist?
    Müsste in denen nicht irgendwie die Ursprungsgröße der Form abespeichert werden ?

    Gruß

    TimeOut schrieb:

    wenn er ihnen keine Werte zuweist
    Da hast Du ja glatt einen Fehler gefunden. :thumbsup:
    Woher hast Du denn den Code?
    Macht er, was er soll?
    Wenn nein: Was macht er nicht?
    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!
    :rolleyes:



    den Code habe ich von hier

    vb-fun.de/cgi-bin/forumarchiv.…eseite&nummer=33561#Atext



    Naja irgendwie nicht ganz.

    Also mein Programm ist mit einer Auflösung von 1280x1024 erstellt worden.

    Habe es auf einem laptop mit 1680x1050 ausprobiert, da wurde es korrekt angezeigt.

    Wird es allerdings auf einer auflösung von 1920x720 aufgerufen, schneidet er ein gutes Stück unten ab. Wird wohl an den gut 300 fehlenden Pixeln liegen, nehm ich an?!

    Also so richtig scheint das Skalieren nicht zu funktionieren :D
    Dann überleg mal, was passieren sollte, mal Dir das ggf. auf.
    Welche Form-Größe sollte hinterher rauskommen?
    Setz einen Haltepunkt rein und überprüf das.
    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!
    Eine Anwendung sollte immer sizeable sein.
    Dann ist egal, in welchem Monitor sie angezeigt wird.
    gugge etwa die SampleSolutions von PictureViewer

    Ist nur ein Beispiel, aber das Prinzip ist auf alle möglichen Anwendungen übertragbar: immer gibt es (kleinere) fixe Bereiche und (größere) flexible, und wennde nurnen kleinen Bildschirm hast, dann siehste halt weniger Zeilen inne Listbox, aber zum an den Monitor anpassen ist kein Code notwendig.
    Also die Form habe ich nun hinbekommen, dass sie sich an die Auflösung anpasst, allerdings juckt das die Steuerelemente herzlich wenig.



    @ErfinderDesRades

    Genau so soll es eigentlich auch bei mir funktionieren.

    Allerdings ist mir nicht klar wo und wie du es so angestellt hast, dass sich alles vergrößer/verkleinern lässt.

    Meine Form ist sizeable, aber ich habe noch jede Menge Txt/Listboxen und eine Tabcontrol drinne, die sich nicht ändern :/
    Was macht

    TimeOut schrieb:

    VB.NET-Quellcode

    1. CtlLoop(ctl)
    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!
    Oh stimmt, da gehört das hier noch dazu


    VB.NET-Quellcode

    1. Public Sub CtlLoop(ByVal Ctl As Control)
    2. ControlResize(Ctl)
    3. If Ctl.HasChildren = True Then
    4. ' rekursiv vorhandene UnterControls durchlaufen
    5. For Each c As Control In Ctl.Controls
    6. ControlResize(c)
    7. Call CtlLoop(c)
    8. Next
    9. End If
    10. End Sub
    11. Public Sub ControlResize(ByVal Ctl As Control)
    12. With Ctl
    13. Try
    14. .Font = New Font(.Font.FontFamily, .Font.Size * CSng(X), .Font.Style, GraphicsUnit.Point)
    15. Catch
    16. End Try
    17. .SetBounds(CInt(.Left * X), CInt(.Top * Y), CInt(.Width * X), CInt(.Height * Y))
    18. End With
    19. End Sub

    TimeOut schrieb:

    da gehört das hier noch dazu
    Sicher auch noch ein paar globale / Klassen-Variablen...
    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!

    VB.NET-Quellcode

    1. Public Class ScaleWindow
    2. 'Skalierung aller Forms und Steuerelementen
    3. ' Bildschirmauflösung, unter der die Userform erstellt wurde
    4. Const X_RESOLUTION As Short = 1280
    5. Const Y_RESOLUTION As Short = 1024
    6. 'X = Aktuelle Horizontal-Auflösung/1280
    7. 'Y = Aktuelle Vertikal-Auflösung/1024
    8. Public X, Y As Double
    9. Public Sub New()
    10. MyBase.New()
    11. End Sub
    Warum benutzt du nicht einfach FlowLayoutPanel, TableLayoutPanel, SplitContainer und Panel? In Kombination mit der .Dock-Eigenschaft von Controls kannst du damit sehr hübsche Layouts zaubern, welche sich ohne Code automatisch der aktuellen Größe der Form anpassen :).
    Am besten erstellst du dir eine komplett neue Form, welche von Anfang an auf diesem System basiert, anders wäre es viel mehr Aufwand.

    PS: Hast du dir die Controls überhaupt mal angeschaut? Die sind eigentlich so einfach zu bedienen, das solltest du sofort und ohne Probleme hinbekommen.

    TimeOut schrieb:

    Genau so soll es eigentlich auch bei mir funktionieren.

    Allerdings ist mir nicht klar wo und wie du es so angestellt hast, dass sich alles vergrößer/verkleinern lässt.

    ...
    Kennst du dazu ein gutes Tutorial in dem es erklärt wird?
    naja - guck das Video genau, dann siehst du SplitContainer.
    gugge auch das Filmchen in DialogResultSample, da siehst du TableLayoutPanel.

    gugge auch Layout in WinForms, dassisn reichhaltiges Sample.

    ansonsten viel damit rumspielen, dann kriegt mans raus.
    Merkregel: Keinen Resizing-Code schreiben.