3

可能重复:
在 C# 中垂直(仅)可调整大小的窗口形式

我有一个案例,我需要允许用户仅水平调整表单的大小。表格的最大宽度为x. 我怎样才能做到这一点?

4

5 回答 5

9

将您的 MaximumSize 和 MinimumSize 设置为相同的高度,但宽度可变。

为了使调整大小光标不会出现在顶部或底部:

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.Top || result == HitTest.Bottom)
                m.Result = new IntPtr((int)HitTest.Caption);
            if (result == HitTest.TopLeft || result == HitTest.BottomLeft)
                m.Result = new IntPtr((int)HitTest.Left);
            if (result == HitTest.TopRight || result == HitTest.BottomRight)
                m.Result = new IntPtr((int)HitTest.Right);

            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
}

代码复制和修改自:Vertically (only) resizable windows form in C#

于 2012-10-05T16:58:59.647 回答
2

Form 具有MaximumSize 和MinimumSize 属性。

将它们设置为与 Size 相同,当然 MaximumSize 的 Width 除外。

禁用 MaximizeBox 也可能是一个好主意,因为它并没有多大意义(它只会将窗口放在当前监视器的左上角)。

于 2012-10-05T17:00:57.907 回答
1

您可以创建一个静态变量来保存它可以拥有的 mex 值。

在表单调整大小事件中,您可以检查该值是否大于您的静态值并将其更改为该值:

int maxValue = 100;

    private void MainForm_ResizeEnd(object sender, EventArgs e)
            {
                 if(this.Size.Width > maxValue)
                     this.Size.Width = maxValue;
            }

或者您可以在属性中设置最大值:MaximunSize

于 2012-10-05T16:59:47.600 回答
0

在表单 SizeChanged 事件中,您可以执行以下操作

     private void Form1_ResizeEnd(object sender, EventArgs e) {
        //this does not prevent a resize to full screen

        int i = this.Size.Height;
        //force width to 300
        this.Size = new Size(300, i);
        return;
    }
于 2012-10-05T17:21:06.143 回答
0

将窗体的最小和最大高度设置为窗体的初始高度。这应该防止表单垂直调整大小并允许用户仅水平调整表单大小。

如果要设置水平调整大小的范围,请对表单的最小或最大宽度执行相同操作。

于 2012-10-05T16:59:15.167 回答