我有一种情况,我允许用户调整窗体大小,但只能垂直调整窗口大小。经过一番搜索,似乎这个特定的主题并不多。有可能吗?
答案 0 :(得分:74)
您需要将表单的MinimumSize
和MaximumSize
属性设置为两种不同高度但宽度相等的尺寸。
如果您不希望水平调整大小光标出现,则需要处理WM_NCHITTEST
消息,如下所示:
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
}
答案 1 :(得分:12)
只是一个想法......
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);
}
}
编辑:请注意,最小/最大尺寸解决方案比这个黑客工作要好得多:)
答案 2 :(得分:7)
设置最高&最小尺寸仅适用于表格宽度。
答案 3 :(得分:2)
让FormBorderStyle为Resizable并设置MaximumSize和MinimumSize = new Size(this.Width,0)
<强>校正强>:
this.MinimumSize = new Size(this.Width, 0);
this.MaximumSize = new Size(this.Width, Int32.MaxValue);
答案 4 :(得分:1)
是的,有可能。只需设置你的form.MinimumSize.Width = form.MaximumSize.Width = 100(或你想要的任何宽度)。
答案 5 :(得分:0)
为了避免@ orsogufo解决方案的“橡皮筋”效应:
public Form1()
{
InitializeComponent();
this.MinimumSize = new Size(500, 0);
this.MaximumSize = new Size(500, Screen.AllScreens.Max(s => s.Bounds.Height));
}
如果调整屏幕边界大小,它将无法正确调整其最大高度以容纳更大的屏幕,但对于静态屏幕尺寸,它可以很好地工作。