Buttons dynamisch erzeugen und platzieren

  • C#

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    Buttons dynamisch erzeugen und platzieren

    Guten Morgen liebe Community,

    ich habe vor, meine eigene MessageBox zu programmieren.
    Da ich keine Buttons auf dem Dialog platziert habe, müssen diese dynamisch erzeugt und platziert werden.
    Grundsätzlich kein Problem, jedoch verstehe ich das Koordinatensystem scheinbar nicht ganz...

    Hier mal die Methode, welche mir einen (weiteren) Button hinzufügt:
    Spoiler anzeigen

    C#-Quellcode

    1. private void AddButton(string text, DialogResult dialogResult)
    2. {
    3. //prepare button
    4. Button btn = new Button();
    5. btn.Size = new Size( 150, 50 );
    6. btn.FlatStyle = FlatStyle.Flat;
    7. btn.FlatAppearance.BorderSize = 0;
    8. btn.Font = Core.CorporateDesign.Fonts.Button;
    9. btn.Text = text;
    10. btn.ForeColor = Color.White;
    11. btn.DialogResult = dialogResult;
    12. if (dialogResult == DialogResult.Yes || dialogResult == DialogResult.OK ) btn.BackColor = Core.CorporateDesign.Colors.Button_Blue;
    13. else btn.BackColor = Core.CorporateDesign.Colors.Button_Red;
    14. //add control
    15. Controls.Add( btn );
    16. //calculate location
    17. int x = Width - btn.Width - btn.Margin.Right - ( buttons.Count * (btn.Width + btn.Margin.Right));
    18. int y = Height - btn.Height - btn.Margin.Bottom;
    19. btn.Location = new Point(x, y);
    20. //add button to list (for multiple buttons)
    21. buttons.Add( btn );
    22. }


    Wenn ich als Location den Punkt 0,0 angebe, platziert sich der Button wie erwartet in der oberen linken Ecke des Dialogs - soweit verstanden.
    Wenn ich den Button nun in der unteren rechten Ecke platzieren möchte, würde ich nun für X Dialogbreite - Buttonbreite und für Y Dialoghöhe - Buttonhöhe annehmen.
    Falsch gedacht:


    Wie soll ich das verstehen?
    Probier mal ClientRectangle.Width und Height anstatt das Rectangles des ganzen Forms. Das Form.ClientRectangle ist der Bereich ohne Titelbar und Rahmen, also genau der mit dem du rechnen solltest.
    Denn Form.Height ist Höhe Titelbar + Höhe unterer Rahmen + Höhe ClientRectangle, also einige Pixels mehr als das ClientRectangle, daher kommste wohl zu tief.

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

    Also das ClientRectangle, da wird nichts angehangen. Es ist einfach der Bereich wo die Controls hinzugefügt werden, bzw. der Bereich der dafür vorgesehen ist. Anders gesagt, das ClientRectangle, ist der Bereich der auf deinem ScreenShot Weis ist. Alles anderen drumrum ist Size und location des Forms, was aber auch dat ClientRectangle beinhaltet.
    Okay, dann habe ich es glaub verstanden.
    Wenn ich also Controls platziere, werden sie immer im ClientRectangle platziert, was erklärt, weshalb es bei Koordinate 0, 0 oben links ist.
    Beim Platzieren am unteren Rand wird's dann bissl tricky, da man bei Verwendung von Form.Height noch die Höhe der Titelleiste + Rand verrechnet, anstatt nur den weißen Bereich (ClientRectangle/ClientSize).

    Danke :thumbsup:
    @TRiViUM Nimm ein FlowLayoutPanel.
    Pack da alle vorkommenden Button in der richtigen Reihenfolge zueinander rein (wenn mehrere angezeigt werden sollen).
    In der Konfiguration machst Du alle Button .Visible = False, die nicht zu sehen sein sollen.
    Hole Dir aus dem Framework das richtige Icon dazu 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!
    Die Position passt jetzt, wenn ich mit ClientSize arbeite, allerdings hab ich jetzt einen Seiteneffekt:


    Gibt's dafür ne logische Erklärung, dass der Text ab der Hälfte abgeschnitten ist? :huh:

    @RodFromGermany Ich kannte das FlowLayoutPanel bislang gar nicht aber scheint mir dafür wie gemacht zu sein, da muss ich ja auch nicht mal was für berechnen.
    Und das Problem mit dem abgeschnittenen Text hab ich da vermutlich auch nicht....

    TRiViUM schrieb:

    das Problem mit dem abgeschnittenen Text hab ich da vermutlich auch nicht....
    Wahrscheinlich nicht, denn Du kannst alles im Designer einrichten.
    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!