ユーザーがウィンドウフォームのサイズを垂直方向にのみ変更できるようにすると便利な場合があります。少し調べてみると、この特定のテーマについてはそれほど多くないようです。出来ますか?
フォームの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
}
ただのアイデア...
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 [〜#〜]:最小/最大サイズのソリューションはこのハックよりもはるかにうまく機能することに注意してください:)
フォームの幅のみの最大サイズと最小サイズを設定します。
FormBorderStyleをResizableに設定し、MaximumSizeおよびMinimumSize = new Size(this.Width、0)を設定します
修正:
this.MinimumSize = new Size(this.Width, 0);
this.MaximumSize = new Size(this.Width, Int32.MaxValue);
はい、可能です。 form.MinimumSize.Width = form.MaximumSize.Width = 100(または任意の幅)を設定するだけです。
@orsogufoのソリューションの「ラバーバンディング」効果を回避するには:
public Form1()
{
InitializeComponent();
this.MinimumSize = new Size(500, 0);
this.MaximumSize = new Size(500, Screen.AllScreens.Max(s => s.Bounds.Height));
}
画面の境界のサイズを変更すると、大きな画面に合わせて最大の高さが正しく調整されませんが、静的な画面サイズの場合はうまく機能します。