myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Buttons dem maximierten Fenster anpassen und entsprechend vergrößern
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Buttons dem maximierten Fenster anpassen und entsprechend vergrößern

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
C#Rocki C#Rocki ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.12.2019
Beiträge: 5
Entwicklungsumgebung: C#(Windows Forms APP)


C#Rocki ist offline

Buttons dem maximierten Fenster anpassen und entsprechend vergrößern

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
public void fenster_maximieren(Button button)

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

C#-Code:
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 großes Grinsen Daumen hoch

C#Rocki hat dieses Bild (verkleinerte Version) angehängt:
C#-Problem.png
Volle Bildgröße

19.12.2019 17:59 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.365
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
19.12.2019 18:03 Beiträge des Benutzers | zu Buddylist hinzufügen
C#Rocki C#Rocki ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.12.2019
Beiträge: 5
Entwicklungsumgebung: C#(Windows Forms APP)

Themenstarter Thema begonnen von C#Rocki

C#Rocki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hier ist der Code dafür:

C#-Code:
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));
        }

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von C#Rocki am 19.12.2019 19:13.

19.12.2019 19:13 Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.019


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 :-)

Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
            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.
20.12.2019 06:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.448
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?
20.12.2019 08:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
C#Rocki C#Rocki ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.12.2019
Beiträge: 5
Entwicklungsumgebung: C#(Windows Forms APP)

Themenstarter Thema begonnen von C#Rocki

C#Rocki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von chilic:
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...
20.12.2019 13:14 Beiträge des Benutzers | zu Buddylist hinzufügen
C#Rocki C#Rocki ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.12.2019
Beiträge: 5
Entwicklungsumgebung: C#(Windows Forms APP)

Themenstarter Thema begonnen von C#Rocki

C#Rocki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von chilic:
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.

C#-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

C#-Code:
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?
20.12.2019 14:36 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.448
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
20.12.2019 14:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
C#Rocki C#Rocki ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.12.2019
Beiträge: 5
Entwicklungsumgebung: C#(Windows Forms APP)

Themenstarter Thema begonnen von C#Rocki

C#Rocki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Th69:
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:

C#-Code:
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. Augenzwinkern großes Grinsen
08.01.2020 21:26 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.448
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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).

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Th69 am 09.01.2020 10:29.

09.01.2020 10:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 28.01.2020 05:35