web-dev-qa-db-ja.com

C#で垂直方向(のみ)にサイズ変更可能なウィンドウフォーム

ユーザーがウィンドウフォームのサイズを垂直方向にのみ変更できるようにすると便利な場合があります。少し調べてみると、この特定のテーマについてはそれほど多くないようです。出来ますか?

35
Ben

フォームのMinimumSizeプロパティとMaximumSizeプロパティを、高さは異なるが幅は同じである2つのサイズに設定する必要があります。

水平方向のサイズ変更カーソルをまったく表示したくない場合は、次のように 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
}
75
SLaks

ただのアイデア...

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

[〜#〜] edit [〜#〜]:最小/最大サイズのソリューションはこのハックよりもはるかにうまく機能することに注意してください:)

12
Paolo Tedesco

フォームの幅のみの最大サイズと最小サイズを設定します。

7
Gabe

FormBorderStyleをResizableに設定し、MaximumSizeおよびMinimumSize = new Size(this.Width、0)を設定します

修正

this.MinimumSize = new Size(this.Width, 0);
this.MaximumSize = new Size(this.Width, Int32.MaxValue);
3
Alex LE

はい、可能です。 form.MinimumSize.Width = form.MaximumSize.Width = 100(または任意の幅)を設定するだけです。

1
Igor Korkhov

@orsogufoのソリューションの「ラバーバンディング」効果を回避するには:

public Form1()
{
    InitializeComponent();
    this.MinimumSize = new Size(500, 0);
    this.MaximumSize = new Size(500, Screen.AllScreens.Max(s => s.Bounds.Height));
}

画面の境界のサイズを変更すると、大きな画面に合わせて最大の高さが正しく調整されませんが、静的な画面サイズの場合はうまく機能します。

0
Dathan