如何在VB.NET Windows窗体中防止垂直调整大小

3

在使用Windows Forms时,我想知道是否有一种方法可以防止窗体垂直调整大小。我希望用户可以在所有方向上调整窗体大小,除了垂直方向。此外,我希望允许向上垂直调整大小,但不允许向下。

我曾尝试使用maximumsize属性,将其设置为:Me.maximumsize = new size(0, me.height)。

我将宽度设置为0,因为我希望用户可以更改窗体宽度。

不幸的是,这并没有起作用。

有什么建议吗?

5个回答

8

在启动时,您必须小心允许表单自适应大小。这是必要的,以适应具有不同视频DPI设置或不同系统字体大小的计算机上所需的缩放。或者用户覆盖更改了标题栏的高度。所有这些都将在Load事件运行时解决。因此:

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

接下来你需要做的是修复当用户将光标移动到可以垂直调整窗口大小的窗口边缘时,光标的行为。这有点丑陋;你需要在WndProc中捕获WM_NCHITTEST消息并更改消息返回值:

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

优秀的样例!这正是我所需要的。这里还有其他一些很好的解决方案,但我认为这个最符合我的需求。有了它,我可以完全控制所有的调整方向。太棒了!但是有一个问题,我有疑问……我想知道是否可以将消息返回值更改为我想要的值。你返回的消息值是否重要?能返回任何值吗?为什么要返回这些值,而不是其他值?非常感谢! - user304602
请查阅 WM_NCHITTEST 的 MSDN 文档。http://msdn.microsoft.com/zh-cn/library/ms645618%28VS.85%29.aspx - Hans Passant

3

设置表单的最大和最小大小属性,或在Form_Load下编写以下代码:

this.MaximumSize=new System.Drawing.Size(2048, 300);
this.MinimumSize=new System.Drawing.Size(0, 300);

使两者高度相同。


1

大多数情况下,开发人员在设计时设置了表单大小,因此代码应该是:

private void FormLogin_Load(object sender, EventArgs e)
{
     this.MaximumSize = this.Size;
     this.MinimumSize = this.Size;
}

1

有几种解决方案。其中一个简单的方法是:

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

请注意,调整大小始终是向下的。当您向上调整大小时,会更改表单的位置和向下调整大小。

好主意检查高度是否需要修改,因为高度更改会导致另一个调整大小事件被触发,以此类推。如果没有“if”,您将陷入无限循环。 - Tiberiu Ana
好的解决方案,但在我的情况下唯一的问题是我必须在不同的点上不断更新originalSize变量,这对我来说并不太方便。但你的解决方案很好!谢谢 - user304602
1
你可以创建一个自定义属性,它可以同时更新窗体的大小和原始大小变量。 - Ignacio Soler Garcia

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接