5

フォームの縦横比を固定して、サイズを変更しても保持されるようにするにはどうすればよいですか?

[新しい]高さ/幅をオーバーライドして手動で変更することで実行できることはわかっていますがOnSizeChanged、イベントが呼び出される前に一度サイズ変更され(アスペクト比に一致しないサイズに)、再度サイズ変更されるため、ちらつきが発生します正しい縦横比)。より良い方法はありますか?

4

1 に答える 1

12

開始するためのコード。重要なのは、WM_SIZING メッセージに応答することです。これにより、ウィンドウの四角形を変更できます。このサンプルは大雑把です。m.WParam. ユーザー インターフェイスは決して優れたものではありません。ユーザーがコーナーをドラッグしたときに、合理的なことは何もできません。フォームのレイアウトを十分に柔軟にして、アスペクト比を気にしないようにすることが本当の解決策です。コンテンツがほとんど収まらない場合にスクロールバーを表示すると、ユーザーは正しいことを自動的に行うことができます。

using System.Runtime.InteropServices;
// etc..

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x216 || m.Msg == 0x214) { // WM_MOVING || WM_SIZING
            // Keep the window square
            RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
            int w = rc.Right - rc.Left;
            int h = rc.Bottom - rc.Top;
            int z = w > h ? w : h;
            rc.Bottom = rc.Top + z;
            rc.Right = rc.Left + z;
            Marshal.StructureToPtr(rc, m.LParam, false);
            m.Result = (IntPtr)1;
            return;
        }
        base.WndProc(ref m);
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }
}
于 2010-08-02T21:01:40.613 に答える