GUI: Top Button Bar (Wie die Button Größe berechnen?)

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    GUI: Top Button Bar (Wie die Button Größe berechnen?)

    Moin VB Paradise

    Ich arbeite gerade daran eine eigene Top Button Bar zu schreiben und hab leider noch kein "Perfekten" weg gefunden um die
    Buttons die man über eine String Liste selbst hinzufügen kann mittig anzuordnen, ist es überhaupt möglich zb 4 Buttons
    ab zb X + 9 und zwischen Breite -9 schlüssig dazustellen? Ich hab 2 Ideen aber möchte mir hier gerne weitere anhören um das
    beste Ergebnis zu erzielen. Eine Idee wäre alle Buttons so groß zu machen das sie kurz vor dem Rand enden würden, den rest würde
    ich dann mit einer leeren Fläche auffüllen. Momentan Addiere ich ein Button dazu um die Freie Fläche zu erzeugen und fülle den
    Rest dann selbst aus
    . Freue mich auf Vorschläge.

    Beispiel Screenshot im Dateianhang.

    /Edit

    *Textfarbe Rot nur für das Forum-Team, bitte beachten. Admin*
    Bilder
    • VB Theme.png

      10,57 kB, 656×385, 96 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Steven du könntest

    Die Mitte ausfindig machen also Width / 2
    Und von diesem Mittelpunkt in gleichem Abstand die Buttons Positionieren
    Je nach Anzahl der Buttons musst du diese automatisch Skalieren um Sie an deine Bedürfnisse Anzupassen

    also z.b (Pseudocode)

    if(Buttons > 4 )
    Buttons.Size = "Deine berechnete Größe"



    LG Mausekeks
    Brain is Loading: 35%
    @Steven Warum muss es was eigenes sein?
    Nimm doch ein ToolStrip und feddich.
    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!

    mausekeks schrieb:

    @Steven du könntest

    Die Mitte ausfindig machen also Width / 2
    Und von diesem Mittelpunkt in gleichem Abstand die Buttons Positionieren
    Je nach Anzahl der Buttons musst du diese automatisch Skalieren um Sie an deine Bedürfnisse Anzupassen

    also z.b (Pseudocode)

    if(Buttons > 4 )
    Buttons.Size = "Deine berechnete Größe"



    LG Mausekeks


    Danke dir, ich werde das mal probieren, vilt funkt das besser, aber glaube fast das selbst die Methode ungenau ist (Evt den ersten und letzten Button Kurzen).
    Ich könnte den letzten Button sonst so anpassen das die Differenz ausgeglichen wird, ich muss mal gucken was an besten aussieht, ich hab
    jetzt ein paar Methoden.

    VB.NET-Quellcode

    1. If _TopButtonsVisible = True And Not _Buttons.Count = Nothing And _Buttons.Count <= 20 Then
    2. G.DrawLine(New Pen(Color.FromArgb(90, BC(2))), New Point(10, 70), New Point(Width - 10, 70))
    3. Dim S As Integer = CInt((Width) / (_Buttons.Count + 1))
    4. Dim MainRect As Rectangle
    5. For i As Integer = 0 To _Buttons.Count - 1
    6. MainRect = New Rectangle((S * i) + 9, 39, S, 30)
    7. If Not TopButtonSelect = -1 And TopButtonSelect = i Then
    8. G.FillRectangle(New SolidBrush(_TopButtonsShadowColor), MainRect)
    9. G.DrawRectangle(New Pen(BC(2)), MainRect)
    10. Dim PosX As Integer = CInt((S * (i + 1) - (S / 2)) - (G.MeasureString(CStr(_Buttons.GetValue(i)), _TopButtonsFont).Width / 2))
    11. G.DrawString(CStr(_Buttons.GetValue(i)), _TopButtonsFont, New SolidBrush(_TopButtonsShadowFontColor), New Point(PosX + 9, 47))
    12. ElseIf TopButtonSelect = -1 Or Not TopButtonSelect = i Then
    13. G.FillRectangle(New SolidBrush(_TopButtonsBackColor), MainRect)
    14. G.DrawRectangle(New Pen(BC(2)), MainRect)
    15. Dim PosX As Integer = CInt((S * (i + 1) - (S / 2)) - (G.MeasureString(CStr(_Buttons.GetValue(i)), _TopButtonsFont).Width / 2))
    16. G.DrawString(CStr(_Buttons.GetValue(i)), _TopButtonsFont, New SolidBrush(_TopButtonsFontColor), New Point(PosX + 9, 47))
    17. End If
    18. Next
    19. G.FillRectangle(New SolidBrush(_TopButtonsBackColor), New Rectangle((S * _Buttons.Count) + 9, 39, Width - (S * _Buttons.Count) - 19, 30))
    20. G.DrawRectangle(New Pen(BC(2)), New Rectangle((S * _Buttons.Count) + 9, 39, Width - (S * _Buttons.Count) - 19, 30))
    21. End If


    /Edit

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Steven“ ()

    Bitte erstelle nicht bei jedem Zeichnen oder Füllen von etwas einen New Brush bzw Pen,
    sonder verwende einen und zum Schluss .Dispose um den Speicher wieder freizugeben. (Oder Ein Using)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Erstelle deine Zeichen Elemente zu beginn mit einem Using
    Using p as New Pen(Color, width) und schließe das using mit einem End Using am ende des Zeichnens. (Das selbe mit einem Brush)
    Zwischendurch wenn du die Farben des Stiftes ändern möchtest, erstelle keine neuen sondern setze lediglich die Farbeigenschaften der gerade erstellen Elemente:
    p.Color = Color.Green sowie brush.Color = Color.Green

    Somit sparst du Arbeitsspeicher beim Zeichnen.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    @Steven Ich hätte geren eine Antwort auf diese Frage:

    RodFromGermany schrieb:

    Warum muss es was eigenes sein?
    Nimm doch ein ToolStrip und feddich.
    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!
    @Steven Bitte zitiere nicht gesamte Postings (noch dazu, wenn diese direkt über deinem stehen), sondern zitiere sinnvoll (Passagen) oder spreche den User nur mittels @user an.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Alles klar, ich achte drauf.


    Gather schrieb:

    Erstelle deine Zeichen Elemente zu beginn mit einem Using
    Using p as New Pen(Color, width) und schließe das using mit einem End Using am ende des Zeichnens. (Das selbe mit einem Brush)
    Zwischendurch wenn du die Farben des Stiftes ändern möchtest, erstelle keine neuen sondern setze lediglich die Farbeigenschaften der gerade erstellen Elemente:
    p.Color = Color.Green sowie brush.Color = Color.Green

    Somit sparst du Arbeitsspeicher beim Zeichnen.

    Ach stimmt, über "using" bin ich einmal gestolpert, aber war mir nicht mehr ganz
    klar über die Funktion, danke dir für die Erklärung werde die Funktion nun nutzen.

    RodFromGermany schrieb:

    @Steven Ich hätte geren eine Antwort auf diese Frage:

    RodFromGermany schrieb:

    Warum muss es was eigenes sein?
    Nimm doch ein ToolStrip und feddich.

    Ich bin Hobby Programmierer und versuche mich gerade daran alle Controls durch mein eigenes
    Designe zu ersetzen, bevor ich meine End Software fertig stelle hätte ich halt gerne ein eigenes Designe.

    Lg Steve

    Steven schrieb:

    durch mein eigenes Designe zu ersetzen
    Probierma folgendes:
    Nimm das vorhandene Control, gib ihm die Property .OwnerDraw = True so vorhanden und gib ihm so sein Design bei voller Funktionalität.
    Wie das konkret gemacht wird, findest Du in der MSDN, das Zauberwort hier ist OwnerDraw.
    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!