Reputation: 991
Working with Windows Forms, I wonder if there is some way to prevent vertically resize of the form. I would like to allow user to resize a form in all directions except vertically. Moreover, I would like to allow vertically resize in the upward direction, but not downward.
I have tried to use maximumsize by setting it to: Me.maximumsize = new size(0, me.height)
I set width to 0, because I want to allow user to change the form width.
Unfortunately it doesn't work.
Any ideas?
Upvotes: 3
Views: 7281
Reputation: 11
Most of the time the developer has set the form size at design time, so the code would be:
private void FormLogin_Load(object sender, EventArgs e)
{
this.MaximumSize = this.Size;
this.MinimumSize = this.Size;
}
Upvotes: 1
Reputation: 13161
Set the form's Maximum and Minimum Size properties or write the code below at Form_Load:
this.MaximumSize=new System.Drawing.Size(2048, 300);
this.MinimumSize=new System.Drawing.Size(0, 300);
Give the same height to both.
Upvotes: 3
Reputation: 9986
Register for the Control.Resize
Event, and enforce your desired height.
Upvotes: 0
Reputation: 21855
There are several solutions. An easy one is this:
Dim originalSize As Integer = Me.Height
Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
If Me.Height <> originalSize Then
Me.Height = originalSize
End If
End Sub
Have in mind that resizes are always down. When you resize up, you change the location of the form and resizing down.
Upvotes: 1
Reputation: 941218
You have to be careful to allow the form to resize itself at startup. It is necessary to accommodate scaling needed on a machine that has a different video DPI setting or a different system font size. Or a user override that changed the height of the title bar. All of this is sorted out by the time the Load event runs. Thus:
protected override void OnLoad(EventArgs e) {
Screen scr = Screen.FromControl(this);
this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
this.MaximumSize = new Size(scr.WorkingArea.Width, this.Height);
}
The next thing you ought to do is fix the behavior of the cursor when the user moves it on an edge of the window that allows resizing the window vertically. That's a bit ugly; you have to trap the WM_NCHITTEST message with WndProc and change the message return value:
protected override void WndProc(ref Message m) {
base.WndProc(ref m);
if (m.Msg == 0x84) { // Trap WM_NCHITTEST
switch (m.Result.ToInt32()) {
case 12: m.Result = (IntPtr)2; break; // HTTOP to HTCAPTION
case 13: m.Result = (IntPtr)10; break; // etc..
case 14: m.Result = (IntPtr)11; break;
case 15: m.Result = (IntPtr)1; break;
case 16: m.Result = (IntPtr)10; break;
case 17: m.Result = (IntPtr)11; break;
}
}
}
Upvotes: 8