2 using System.Collections.Generic;
3 using System.Diagnostics;
6 using System.Windows.Forms;
12 public class ApplicationForm : SharpDX.Windows.RenderForm, IDisposable
15 /// ウィンドウの表示モード(全画面 or ウィンドウ)を示す。
16 /// true なら全画面モード、false ならウィンドウモードである。
17 /// 値を set することで、モードを変更することもできる。
20 /// 正確には、「全画面(fullscreen)」ではなく「最大化(maximize)」。
29 Trace.Assert( this._初期化完了 );
31 if( this.IsFullscreen )
33 Log.Info( "ウィンドウモードに移行します。" );
35 this.WindowState = FormWindowState.Normal;
36 this.ClientSize = this._ウィンドウモードの情報のバックアップ.clientSize;
37 this.FormBorderStyle = this._ウィンドウモードの情報のバックアップ.formBorderStyle;
39 this.IsFullscreen = false;
43 Log.Info( "全画面モードに移行します。" );
45 this._ウィンドウモードの情報のバックアップ.clientSize = this.ClientSize;
46 this._ウィンドウモードの情報のバックアップ.formBorderStyle = this.FormBorderStyle;
48 // (参考) http://www.atmarkit.co.jp/ait/articles/0408/27/news105.html
49 this.WindowState = FormWindowState.Normal;
50 this.FormBorderStyle = FormBorderStyle.None;
51 this.WindowState = FormWindowState.Maximized;
53 this.IsFullscreen = true;
58 static protected グラフィックデバイス グラフィックデバイス
68 public ApplicationForm( SizeF 設計画面サイズ, SizeF 物理画面サイズ )
70 this.SetStyle( ControlStyles.ResizeRedraw, true );
71 this.ClientSize = 物理画面サイズ.ToSize();
72 this.MinimumSize = new Size( 640, 360 );
73 this.Text = "FDK.ApplicationForm";
75 ApplicationForm.グラフィックデバイス = new グラフィックデバイス( this.Handle, 設計画面サイズ, 物理画面サイズ );
77 this.UserResized += this.OnUserResize;
85 public new void Dispose()
87 Debug.Assert( this._初期化完了 );
89 ApplicationForm.グラフィックデバイス.Dispose();
90 ApplicationForm.グラフィックデバイス = null;
99 /// 派生クラスでオーバーライドすること。
101 public virtual void Run()
103 SharpDX.Windows.RenderLoop.Run( this, () => {
105 var gd = ApplicationForm.グラフィックデバイス;
107 // 全面を黒で塗りつぶすだけのサンプル。
108 gd.D2DDeviceContext.BeginDraw();
109 gd.D2DDeviceContext.Clear( Color4.Black );
110 gd.D2DDeviceContext.EndDraw();
112 gd.SwapChain.Present( 1, SharpDX.DXGI.PresentFlags.None );
119 /// <see cref="Run"/>での初期化が終わり、メインループに入っていれば true。
121 protected bool _初期化完了 = false;
124 /// フォーム生成時のパラメータを返す。
126 protected override CreateParams CreateParams
130 // DWM によってトップウィンドウごとに割り当てられるリダイレクトサーフェスを持たない
131 const int WS_EX_NOREDIRECTIONBITMAP = 0x00200000;
133 var cp = base.CreateParams;
134 cp.ExStyle |= WS_EX_NOREDIRECTIONBITMAP;
142 protected virtual void OnUserResize( object sender, EventArgs e )
144 using( Log.Block( FDKUtilities.現在のメソッド名 ) )
146 Log.Info( $"新しいサイズ: {this.ClientSize}" );
148 // メインループ(RenderLoop)が始まる前にも数回呼び出されるので、それをはじく。
149 if( !( this._初期化完了 ) )
151 Log.Info( "アプリケーションの初期化がまだ完了していないので、リサイズ処理をスキップします。" );
155 //if( ApplicationForm.グラフィックデバイス.物理画面サイズ.Equals( this.ClientSize ) )
157 // Log.Info( "サイズが変更されていないので、リサイズ処理をスキップします。" );
161 var gd = ApplicationForm.グラフィックデバイス;
163 gd.D3DDeviceを取得する( ( d3dDevice ) => {
165 this.スワップチェーンに依存するグラフィックリソースを解放する();
167 gd.サイズを変更する( this.ClientSize, d3dDevice );
169 this.スワップチェーンに依存するグラフィックリソースを作成する( d3dDevice );
174 protected virtual void スワップチェーンに依存するグラフィックリソースを作成する( SharpDX.Direct3D11.Device d3dDevice ) { }
175 protected virtual void スワップチェーンに依存するグラフィックリソースを解放する() { }
179 /// ウィンドウを全画面モードにする直前に取得し、
180 /// 再びウィンドウモードに戻して状態を復元する時に参照する。
181 /// (<see cref="全画面モード"/> を参照。)
183 private (Size clientSize, FormBorderStyle formBorderStyle)