フォームサイズの変更は許可したいが縦横比は維持したい
フォームサイズを変えられることで見た目のバランスが崩れてしまう・・・
フォーム全体に「画像」を表示している場合など、縦横比が変わることで見た目がおかしくなることありますよね。なのでフォームサイズが変えられても縦横比は固定にしておきたい。
Sponsored LinkWndProcメソッドを使用する
WndProcメソッドを使用します。
WndProcメソッドをオーバーライドし、その中で固定した「縦横比」に基づき、フォームの「縦」「横」をセットする形となります。
「wndproc メッセージ一覧」などで検索すると、様々な状態が確認できます。
Sponsored Link以下のコードで
// 当該フォームの既定「縦」「横」サイズ保持用
private float formWidth;
private float formHeight;
public aspect()
{
InitializeComponent();
formWidth = this.Width;
formHeight = this.Height;
}
private const int WM_SIZING = 0x214; // サイズ変更時メッセージID
// 上下左右
private const int WMSZ_LEFT = 1;
private const int WMSZ_RIGHT = 2;
private const int WMSZ_TOP = 3;
private const int WMSZ_BOTTOM = 6;
// 左上・左下
private const int WMSZ_TOPLEFT = 4;
private const int WMSZ_BOTTOMLEFT = 7;
// 右上・右下
private const int WMSZ_TOPRIGHT = 5;
private const int WMSZ_BOTTOMRIGHT = 8;
struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SIZING)
{
// サイズ変更時で処理
RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
int w = rc.Right - rc.Left;
int h = rc.Bottom - rc.Top;
switch (m.WParam.ToInt32())
{
case WMSZ_LEFT:
case WMSZ_RIGHT:
// 左右で幅調整
rc.Bottom = rc.Top + (int)(formHeight * w / formWidth);
break;
case WMSZ_TOP:
case WMSZ_BOTTOM:
// 上下で幅調整
rc.Right = rc.Left + (int)(formWidth * h / formHeight);
break;
case WMSZ_TOPLEFT:
case WMSZ_BOTTOMLEFT:
// 左上・左下で幅調整
rc.Left = rc.Right - (int)(formWidth * h / formHeight);
break;
case WMSZ_TOPRIGHT:
// 右上で幅調整
rc.Top = rc.Bottom - (int)(formHeight * w / formWidth);
break;
case WMSZ_BOTTOMRIGHT:
// 右下で幅調整
rc.Bottom = rc.Top + (int)(formHeight * w / formWidth);
break;
}
Marshal.StructureToPtr(rc, m.LParam, true);
}
base.WndProc(ref m);
}
ユーザがフォームサイズを変更しても縦横比が維持されています。