Laden...

Buttons dem maximierten Fenster anpassen und entsprechend vergrößern

Erstellt von C#Rocki vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.249 Views
C
C#Rocki Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren
Buttons dem maximierten Fenster anpassen und entsprechend vergrößern

Guten Tag/Abend,

Ich habe einen Code geschrieben bei dem ich das Fenster, das gerade geöffnet ist, durch einen Button-Klick maximiere und ich die Buttons dem maximierten Fenster so anpasse, dass die Koordinaten und die Größe der Buttons damit übereinstimmt.

Nun eigentlich sollte es so laufen...

Ich habe den Code geschrieben der heißt:

public void fenster_maximieren(Button button)

wobei ich dann dem Programm gesagt habe, dass wenn ich button1 anklicke soll er

private void button1_Click(object sender, EventArgs e)
        {
            fenster_maximieren(button1);
            fenster_maximieren(button2);
            fenster_maximieren(button3);
            fenster_maximieren(button4);
        }

Das heißt er soll diesen Code für all diese Buttons ausführen, jedoch führt er den Code nur für den angeklickten Button aus und ignoriert die anderen Buttons. Dadurch passen sich die Buttons 2, 3 und 4 nicht dem maximierten Fenster an, und bleiben somit auf der selben Koordinate und in der selben Größe wie sie Standardmäßig eingestellt waren.

Danke im Voraus 😁 👍

16.806 Beiträge seit 2008
vor 4 Jahren

Zeig mal etwas mehr Code, zB den relevanten Code der jeweiligen Buttons.
Vermute, dass die Referenzen nicht stimmen.

Könntest zB auch selbst via Debugger kontrollieren.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

PS: Als Empfehlung mal nen Blick rein werfen: [Artikel] C#: Richtlinien für die Namensvergabe

C
C#Rocki Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Hier ist der Code dafür:

public void fenster_maximieren(Button button)
        {
            int weiteFormAlt = this.ClientSize.Width;
            int höheFormAlt = this.ClientSize.Height;
            int weiteButton = button.ClientSize.Width;
            int höheButton = button.ClientSize.Height;
            int posButtonx = Convert.ToInt32(button.Left);
            int posButtony = Convert.ToInt32(button.Top);
            this.WindowState = FormWindowState.Maximized;
            int weiteFormNeu = this.ClientSize.Width;
            int höheFormNeu = this.ClientSize.Height;
            double vergrößernx = weiteFormNeu / weiteFormAlt;
            double vergrößerny = höheFormNeu / höheFormAlt;
            double posButtonxNeu = vergrößernx * posButtonx+weiteButton * vergrößernx;
            double posButtonyNeu = vergrößerny * posButtony+höheButton * vergrößerny;
            double weiteButtonNeux = vergrößernx * weiteButton;
            double höheButtonNeuy = vergrößerny * höheButton;
            button.Size = new Size(Convert.ToInt32(weiteButtonNeux), Convert.ToInt32(höheButtonNeuy));
            button.Location = new Point(Convert.ToInt32(posButtonxNeu), Convert.ToInt32(posButtonyNeu));
        }
C
2.121 Beiträge seit 2010
vor 4 Jahren

Ich finds ja schon gut wenn man auch mal eine eigentlich unnötige Variable einführt, um damit eine Formel leserlicher zu machen. Etwa wenn Zwischenschritte bei einer Berechnung eingeführt werden, statt alles in eine einzige Formel zu packen.
Aber 14 Variablen für 3 Zeilen Code finde ich dann doch recht krass. Das kann jetzt auch wieder keiner mehr durchblicken.

Was ich ändern würde wäre
Convert.ToInt32 rauswerfen für Left und Top. Die sind doch bereits int.
Double nach int konvertieren: (int)weiteButtonNeu statt Convert.ToInt32(weiteButtonNeu) - ist kürzer und einfacher zu lesen.
button.Left und button.Top nicht extra in eigene Variablen packen - wieder kürzer und spart einen Gedankenschritt. Genauso die neuen Maße des Forms.
"faktor" statt "vergrößern" und "breite" statt "weite" verwenden, das würde mir schneller sagen was gemeint ist.

Ein schneller Versuch, weil ich schon wach bin 😃


            int weiteFormAlt = this.ClientSize.Width;
            int höheFormAlt = this.ClientSize.Height;

            this.WindowState = FormWindowState.Maximized;

            double vergrößernx = this.ClientSize.Width / weiteFormAlt;
            double vergrößerny = this.ClientSize.Height / höheFormAlt;

            button.Size = new Size(
                    (int)(vergrößernx * button.ClientSize.Width),
                    (int)(vergrößerny * button.ClientSize.Height));
            button.Location = new Point(
                    (int)(vergrößernx * button.Left + button.ClientSize.Width * vergrößernx),
                    (int)(vergrößerny * button.Top + button.ClientSize.Height * vergrößerny));

Damit lässt sich dann einfacher debuggen und schauen was für welchen Button passiert.
Nach inhaltlichen Fehler hab ich noch nicht gesucht. Vielleicht steigt ja die Methode mit einer Exception aus, die du evtl. abfängst und daher nichts von ihr merkst? Ich glaube ich hatte mal den Fall dass in irgendeinem Zustand 0 als Breite oder Höhe zurückkam. Dann ist klar dass du beim Dividieren ein Problem kriegst.

Ich wäre mir übrigens gar nicht sicher ob der Aufruf WindowState=... sofort das Fenster ändert, oder ob das erst nach deiner Methode vollständig im Hintergrund passiert. Dann hättest du direkt nach dieser Zeile noch keine endgültig richtigen Werte in this.ClientSize.

4.931 Beiträge seit 2008
vor 4 Jahren

Soll das nur eine Programmierübung sein?
Ansonsten wäre es einfacher bei den Buttons passende Anchor-Werte zu setzen und dem System die Vergrößerung/Verkleinerung zu überlassen, s.a. Kann Form in der Größe dynamisch geändert werden?

C
C#Rocki Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Ich finds ja schon gut wenn man auch mal eine eigentlich unnötige Variable einführt, um damit eine Formel leserlicher zu machen. Etwa wenn Zwischenschritte bei einer Berechnung eingeführt werden, statt alles in eine einzige Formel zu packen.
Aber 14 Variablen für 3 Zeilen Code finde ich dann doch recht krass. Das kann jetzt auch wieder keiner mehr durchblicken.

Ja klar, ist alles etwas zu kompliziert gedacht. Ich habe mich nur eben mal in der Bahn hingesetzt und versucht das alles zu verstehen und beim ausprobieren hat sich ja der eine Button auch geändert.

Aber dankeschön für den übersichtlicheren Code. Ich werde ihn jetzt erstmal anwenden und dann mal schauen was dabei rauskommt...

C
C#Rocki Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Ich wäre mir übrigens gar nicht sicher ob der Aufruf WindowState=... sofort das Fenster ändert, oder ob das erst nach deiner Methode vollständig im Hintergrund passiert. Dann hättest du direkt nach dieser Zeile noch keine endgültig richtigen Werte in this.ClientSize.

Ich habe das Programm jetzt nochmal durchlaufen lassen mit dem bearbeiteten Code.

private void button1_Click(object sender, EventArgs e)
        {
            fenster_maximieren(button1);
            fenster_maximieren(button2);
            fenster_maximieren(button3);
            fenster_maximieren(button4);
        }

Das Problem ist, dass wenn ich den selben Code für "button2" anschließend ausführe, dann ist das Fenster ja schon maximiert und der Code-Teil

double vergrößernx = this.ClientSize.Width / weiteFormAlt;
double vergrößerny = this.ClientSize.Height / höheFormAlt;

macht keinen Sinn weil er ja das jetzige (schon maximiert Fenster) als "[...]FormAlt" annimt, und das jetzige eben das schon maximiert Fenster ist.

Weiß jemand wie ich die "[...]FormAlt" so speichern kann, dass sie für den 2. Button angewendet werden kann? Oder wie kann ich den Faktor von "vergrößern[...]" speichern kann?

4.931 Beiträge seit 2008
vor 4 Jahren

Tja, wenn du Anchor nicht benutzen willst, dann mußt du es eben auf die harte Tour lernen.

Aber als Tipp: speichere vorher die aktuelle Größe.

C
C#Rocki Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Tja, wenn du Anchor nicht benutzen willst, dann mußt du es eben auf die harte Tour lernen.

Aber als Tipp: speichere vorher die aktuelle Größe.

Ich habe zwar versucht das mit Anchor zu programmieren, da ich aber noch etwas neuer bin habe ich diese Weise leider noch nicht verstanden.

Dennoch habe ich mein Problem jetzt lösen können in dem ich die aktuelle Größe gespeichert habe und es somit in der Methode verwendet wurde

Das heißt es sieht wie folgt aus:


public void fenster_maximieren(Button button,int weiteFormAlt,int höheFormAlt)
        {
            this.WindowState = FormWindowState.Maximized;

            double vergrößernx = this.ClientSize.Width / weiteFormAlt;
            double vergrößerny = this.ClientSize.Height / höheFormAlt;

            button.Size = new Size(
                    (int)(vergrößernx * button.ClientSize.Width),
                    (int)(vergrößerny * button.ClientSize.Height));
            button.Location = new Point(
                    (int)(vergrößernx * button.Left + button.ClientSize.Width * vergrößernx),
                    (int)(vergrößerny * button.Top + button.ClientSize.Height * vergrößerny));
        }
private void button1_Click(object sender, EventArgs e)
        {
            int wF = this.ClientSize.Width;
            int hF = this.ClientSize.Height;
            fenster_maximieren(button1, wF, hF);
            fenster_maximieren(button2, wF, hF);
            fenster_maximieren(button3, wF, hF);
            fenster_maximieren(button4, wF, hF);
        }

Bin soo unglaublich froh, dass ich das jetzt lösen konnte.
Und vielen Dank für die Hilfe vonallen. 😉 😁

4.931 Beiträge seit 2008
vor 4 Jahren

Ja, so meinte ich das.

Und beim Anchor brauchst du nichts programmieren, sondern kannst alles direkt im Designer festlegen (z.B. für die linken: Left, Top, Right und für die rechten: Left, Bottom, Right --- oder für alle Left, Top, Right, Bottom).

Es gibt auch explizit die Eigenschaft AutoScaleFactor (dazu müßtest du nur die ursprüngliche Größe der Form speichern und im Resize-Ereignis diesen Faktor neu setzen).