【问题标题】:Limiting form resizing to horizontal [duplicate]将表单大小限制为水平[重复]
【发布时间】:2012-09-26 21:01:29
【问题描述】:

可能重复:
Vertically (only) resizable windows form in C#

我有一种情况,我需要允许用户仅水平调整表单的大小。表单的最大宽度为x。我该怎么做?

【问题讨论】:

  • 没有。它不是重复的。我读了那个问题,我希望你有这个问题作为参考。所以我想要那个用户想要的,但是水平调整大小。
  • @Victor 不过,技术是完全一样的。
  • 不幸的是,我不知道如何管理该代码... :(

标签: c# windows winforms forms resize


【解决方案1】:

将您的 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#

【讨论】:

  • 这不是我想要的。
  • @Victor 为什么不呢?这正是实现了这一点。它与您想要的有什么不同?
  • 对,如果Maximum和Minimum Height设置为200,则不能高于或低于200...但是Minimum Width为0,Maximum Width为10000,他们可以横向调整大小.
  • @Victor,亚当的回答没有提到重复。如果最小和最大高度设置为相同的值,则表单将无法垂直调整大小(如您所愿)。如果最小和最大宽度设置为不同的值,则表单将水平调整大小(再次,如您所愿)。因此,如果您这样做,您的表单将只能根据需要水平调整大小,而不是垂直调整。
  • 我刚刚从该链接复制了代码并对其进行了修改以隐藏顶部和底部的光标。试试看(我没有测试过)。用代码更新了我的答案。
【解决方案2】:

Form 具有 MaximumSize 和 MinimumSize 属性。

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        在表单 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;
            }
        

        【讨论】:

        • 这个方法覆盖效果很好!不过,我不喜欢闪烁。
        猜你喜欢
        • 1970-01-01
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        • 2020-07-11
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多