views:

946

answers:

6

Hi,

I have a situation where it would be beneficial to me to allow my windows form to be resized by the user, but only vertically. After some searching, it seems like there isn't much on this particular subject. Is it possible?

Thanks, -Ben

+9  A: 

You need to set the form's MinimumSize and MaximumSize properties to two sizes with different heights but equal widths.

If you don't want the horizontal resize cursor to appear at all, you'll need to handle the WM_NCHITTEST message, like this:

protected override void WndProc(ref Message m) {
    base.WndProc(ref m);
    switch (m.Msg) {
        case 0x84: //WM_NCHITTEST
            var result = (HitTest)m.Result.ToInt32();
            if (result == HitTest.Left || result == HitTest.Right)
                m.Result = new IntPtr((int)HitTest.Caption);
            if (result == HitTest.TopLeft || result == HitTest.TopRight)
                m.Result = new IntPtr((int)HitTest.Top);
            if (result == HitTest.BottomLeft || result == HitTest.BottomRight)
                m.Result = new IntPtr((int)HitTest.Bottom);

            break;
    }
}
enum HitTest {
    Caption = 2,
    Transparent = -1,
    Nowhere = 0,
    Client = 1,
    Left = 10,
    Right = 11,
    Top = 12,
    TopLeft = 13,
    TopRight = 14,
    Bottom = 15,
    BottomLeft = 16,
    BottomRight = 17,
    Border = 18
}
SLaks
the minsize/maxsize is much cleaner than my solution, +1 from me...
Paolo Tedesco
Can't believe I didn't think of this... Very nice! And thanks for the WndProc particulars of hiding that resize cursor!
Ben
+3  A: 

Set the max & min size for the width of the form only.

gmcalab
much cleaner than my solution, +1 from me...
Paolo Tedesco
Be sure to do so in the Load event, not the constructor. Or automatic scaling will clip the form content.
Hans Passant
If you leave the height component of the MinimumSize and MaximumSize properties at 0 but set a width, it will constrain the window to its minimum height. MinimumSize and MaximumSize constraints are only ignored when both components are zero - if one's set and the other is left at zero, it will enforce both components literally.
Dathan
+4  A: 

Just an idea...

public partial class Form1 : Form {
    int _width;

    public Form1() {
        _width = this.Width;
        InitializeComponent();
    }

    protected override void OnResize(EventArgs e) {
        this.Width = _width;
        base.OnResize(e);
    }
}

EDIT: please note that the min/max size solutions work much better than this hack :)

Paolo Tedesco
Beat me to it. +1 For other solutions, I'm not sure that it's possible to actually have a max/min width without also setting a max/min height. This solution will allow you to resize the form, but it will rubber-band back to it's original width.
George
@George: You can just set a small minimum and a very large maximum.
SLaks
+1  A: 

Yes, it is possible. Just set your form.MinimumSize.Width = form.MaximumSize.Width = 100 (or whatever width you want).

Igor Korkhov
You cannot assign the Width directly as form.MinimunSize or form.MaximumSize returns a value type, not a reference.
Alex LE
It was not a working code sample, just an idea of what should be set up.
Igor Korkhov
A: 

Let the FormBorderStyle to Resizable and set MaximumSize and MinimumSize = new Size(this.Width, 0)

Correction:

this.MinimumSize = new Size(this.Width, 0);
this.MaximumSize = new Size(this.Width, Int32.MaxValue);
Alex LE
This will not work.
SLaks
MinimumSize and MaximumSize components are only interpreted as "no limit" when BOTH components are zero.
Dathan
@SLaks, You're right! the height need to be set to different value in min and max sizes.
Alex LE
A: 

To avoid the "rubber-banding" effect of @orsogufo's solution:

public Form1()
{
    InitializeComponent();
    this.MinimumSize = new Size(500, 0);
    this.MaximumSize = new Size(500, Screen.AllScreens.Max(s => s.Bounds.Height));
}

It won't correctly adjust its maximum height to accommodate a larger screen if you resize the screen bounds, but for static screen sizes it works great.

Dathan