views:

1363

answers:

4

Ok heres my problem. I have a form that when it is not maximised, its maximum size has to be the total height of the components inside the form. To achieve this, i use this:

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

That fires on the Resize event of the form. Because the component size is always changing it made sense to do this on a resize event. How ever if i want to maximise the form, the form just goes to the highest settings defined in this.MaximumSize. So i was wondering is there a way to tell when a form is going to be maximised and set its maximumsize to the screen boundarys before the form maximises.

If there is a better way to change the maximumsize value without resize event, that would also be great :)

+1  A: 

You still need to use the resize event, but check the WindowState:

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

As yshuditelu points out you can set the minimum size property of your form too - which should, when coupled with judicious use of anchor values, mean that it can never shrink too far and when it does grow the components will move and/or grow as required.

ChrisF
Already tried that. The proplem is if i try to edit the width and height of the form when its maximised, nothing happens. Even if i edit the MaximumSize property
Ozzy
I think by setting the MaximumSize property you have effectively disabled the Maximize functionality. Try setting the MaximumSize to (0,0) if the WindowSate is Maximized.
ChrisF
I've just tried it and when I clicked maximize, my app moved to the top left of the screen and stayed at the maximum size.
ChrisF
You also don't get the WindowState set to Maximized.
ChrisF
+2  A: 

Are you sure you don't want to be setting the MinimumSize property? If you set the MinimumSize to the size of all the labels, then the form will never be smaller than that. But it can still grow to whatever size the user wants, so long as it is larger than the minimum.

Timothy Carter
+1 - I missed that bit of the question ;)
ChrisF
I already have a minimum size set. Being a design perfectionist (not saying im good at design tho :P) i cant have the form be larger then all the controls it displays.
Ozzy
A: 

Check out the System.Windows.Forms.Screen class. Get the screen from a relevant point (to handle the multi-mon case) and then get its resolution.

This should work in conjunction with the other comment about checking FormWindowState.Maximized.

Drew Hoskins
+1  A: 

I found the answer that suited me perfectly. A lil WndProc override :D (i love WndProc now)

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);
    }
}

Basically it sets this.maximize to true when it receives teh SC_MAXIMIZE message. The resize event will only set a new MaximumSize if this.maximize is set to false. Nifty xD

Ozzy