アスペクト比が固定されたウィンドウサイズの変更


ウィンドウの枠をマウスでドラッグしてウィンドウサイズを変更したときに、
普通はアスペクト比(縦横比。 [アスペクト比] = [幅]/[高さ])なんかは関係なく、
任意の幅・高さに変更できるわけですが、、
それを、ウィンドウサイズがアスペクト比を一定に保つようにします。

.NETでは Form.SizeChanged イベントあたりを使えばなんとかなりそうな気がしますが、
実際にそれをやってみると、サイズ変更時に画面がちらついたりするようで
あんまりよろしくないです。
調べてみると、ウィンドウ・プロシージャ内で Windows メッセージをごにょごにょやれば
ちらつくことなく、アスペクト比を一定にできるらしいとのこと。

詳しくは、サンプルコードを用意しましたので、そちらを参照してください。
下の方にリンクがあります。

ついでなので、いろいろ使い回しができるように
拡張メソッドとしてまとめてみました。
使い方は、ウィンドウ・プロシージャ( WndProc() をオーバーライドしたメソッド)の中で、 下のように拡張メソッドを呼び出すだけです。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        protected override void WndProc(ref Message m)
        {
            //この一行を追加します。
            this.AspectRatioSizeWndProc(ref m, 16f / 9f, true);
            
            base.WndProc(ref m);
        }
    }
   

サンプルコード
AspectRatioWindow.zip
(Visual C# 2010 Express Edition のプロジェクトです。)



<back to "C# Tips" menu>