user304602
user304602

Reputation: 991

How to prevent vertically resize in VB.NET Windows Forms

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

Answers (5)

Anuradha Jayasena
Anuradha Jayasena

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

HasanG
HasanG

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

Kamran Khan
Kamran Khan

Reputation: 9986

Register for the Control.Resize Event, and enforce your desired height.

Upvotes: 0

Ignacio Soler Garcia
Ignacio Soler Garcia

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

Hans Passant
Hans Passant

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

Related Questions