フォームサイズの縦横比を維持したい (Windows Forms)

Sponsored Link

フォームサイズの変更は許可したいが縦横比は維持したい

フォームサイズを変えられることで見た目のバランスが崩れてしまう・・・

フォーム全体に「画像」を表示している場合など、縦横比が変わることで見た目がおかしくなることありますよね。なのでフォームサイズが変えられても縦横比は固定にしておきたい。

Sponsored Link

WndProcメソッドを使用する

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

ユーザがフォームサイズを変更しても縦横比が維持されています。

タイトルとURLをコピーしました