2009-06-02 11 views
1

Ok heres mein Problem. Ich habe ein Formular, dass, wenn es nicht maximiert ist, seine maximale Größe die Gesamthöhe der Komponenten innerhalb des Formulars sein muss. Um dies zu erreichen, verwende ich dies:C# Tell, wenn das Formular maximiert wird

private void resize_form(object sender, EventArgs e) 
    { 
     this.MaximumSize = new System.Drawing.Size(1000, this.panel4.Height + this.label2.Height + this.HeightMin); 
    } 

Das auf dem Resize-Ereignis des Formulars ausgelöst wird. Da sich die Komponentengröße ständig ändert, ist es sinnvoll, dies bei einem Größenanpassungsereignis zu tun. Wie auch immer, wenn ich das Formular maximieren möchte, geht das Formular nur zu den höchsten Einstellungen, die in diesem .MaximumSize definiert sind. Also habe ich mich gefragt, ob es eine Möglichkeit gibt zu sagen, wann ein Formular maximiert werden soll, und setze seine Maximalgröße auf die Bildschirmgrenzen, bevor das Formular maximiert wird.

Wenn es einen besseren Weg, um den Maximumwert ohne Grßenänderungsereignis zu ändern, die auch groß sein würde :)

Antwort

3

Ich fand die Antwort, die mir perfekt passte. Ein lil WndProc überschreiben: D (i liebe WndProc jetzt) ​​

protected override void WndProc(ref Message message) 
{ 
    const int WM_SYSCOMMAND = 0x0112; 
    const int SC_MAXIMIZE = 0xF030; 

    switch (message.Msg) 
    { 
     case WM_SYSCOMMAND: 
      int command = message.WParam.ToInt32() & 0xfff0; 
      if (command == SC_MAXIMIZE) 
      { 
       this.maximize = true; 
       this.MaximumSize = new System.Drawing.Size(0, 0); 
      } 
      break; 
    } 

    base.WndProc(ref message); 
} 

private void resize_form(object sender, EventArgs e) 
{ 
    if (!maximize) 
    { 
     this.MaximumSize = new System.Drawing.Size(1000, this.panel4.Height + this.label2.Height + this.HeightMin); 
    } 
} 

Im Grunde ist es this.maximize auf true gesetzt, wenn es teh SC_MAXIMIZE Nachricht empfängt. Das resize -Ereignis setzt nur dann eine neue MaximumSize, wenn this.maximize auf false gesetzt ist. Nifty xD

+0

'this.maximize = true;' Ich kann keine Eigenschaft wie maximize finden. Btw Gute Arbeit, hat mir sehr geholfen. –

+0

Ich möchte nur die Liste aller Nachrichten http://www.pinvoke.net/default.aspx/Enums.WindowsMessages hinzufügen –

6

Sie müssen noch das Resize-Ereignis verwenden, aber überprüfen Sie die WindowState:

if (this.WindowState == FormWindowState.Maximized) 
{ 
    // Do your stuff 
} 

Wie Yshuditelu hervorhebt, können Sie auch die Eigenschaft der Mindestgröße Ihres Formulars festlegen. Dies sollte bei sinnvoller Verwendung von Ankerwerten bedeuten, dass es nie zu weit schrumpfen kann und wenn es wächst, werden sich die Komponenten bewegen und/oder wachsen nach Bedarf.

+0

versuchte bereits. Das Problem ist, wenn ich versuche, die Breite und Höhe des Formulars zu bearbeiten, wenn es maximiert ist, passiert nichts. Selbst wenn ich die MaximumSize -Eigenschaft – Ozzy

+0

editiere, denke ich, indem Sie die MaximumSize-Eigenschaft eingestellt haben, haben Sie effektiv die Maximieren-Funktion deaktiviert. Versuchen Sie, die MaximumSize auf (0,0) einzustellen, wenn WindowSate Maximiert ist. – ChrisF

+0

Ich habe es gerade ausprobiert und als ich auf "Maximieren" geklickt habe, wurde meine App nach oben links auf dem Bildschirm verschoben und blieb auf der maximalen Größe. – ChrisF

2

Sind Sie sicher, dass Sie die Eigenschaft MinimumSize nicht festlegen möchten? Wenn Sie die MinimumSize auf die Größe aller Beschriftungen festlegen, wird das Formular nie kleiner als das sein. Aber es kann immer noch so groß werden, wie der Benutzer es wünscht, solange es größer als das Minimum ist.

+0

+1 - Ich habe dieses Bit der Frage verpasst;) – ChrisF

+0

Ich habe bereits eine Mindestgröße festgelegt. Als ein Design-Perfektionist (nicht zu sagen, ich bin gut im Design tho: P) kann ich nicht die Form größer sein als alle Steuerelemente, die es anzeigt. – Ozzy

0

Überprüfen Sie die System.Windows.Forms.Screen Klasse. Holen Sie den Bildschirm von einem relevanten Punkt (um den Multi-Mon-Fall zu behandeln) und dann seine Auflösung.

Dies sollte in Verbindung mit dem anderen Kommentar zum Überprüfen von FormWindowState.Maximized funktionieren.

0

Wenn der Benutzer klickt in der oberen Leiste, können sie die Größe des Fensters, so verwende ich diese:

private void Form1_Resize(object sender, EventArgs e) 
{ 
    if (this.WindowState == FormWindowState.Normal) 
    { 
     this.WindowState = FormWindowState.Maximized; 
    } 
}