ウィンドウの大きさを変えられるクラスを作ってみました。と言っても大きさが変わるたびにサーフィスを再構築しているだけです。
using System;
using System.Windows.Forms;
using System.Drawing;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectDraw;
namespace MDDraw
{
class DirectDrawForm : Form
{
/// <summary>
/// Surfaceが新しく作り替えた時に起こる
/// </summary>
event EventHandler SurfaceChange;
protected Device device_;
protected Surface primarySurface_;
protected Surface secondarySuface_;
protected Clipper clipper_;
public DirectDrawForm()
: base()
{
this.directDrawInitialize();
this.SurfaceInitialize();
this.MinimumSize = new Size(80, 60);
this.SizeChanged += new EventHandler(DirectDrawForm_SizeChanged);
}
void DirectDrawForm_SizeChanged(object sender, EventArgs e)
{
if (WindowState != FormWindowState.Minimized)
{
this.SurfaceInitialize();
}
}
/// <summary>
/// DirectDrawの初期化を行います。
/// </summary>
private void directDrawInitialize()
{
//デバイスを作成
device_ = new Device();
}
/// <summary>
/// Surfaceの初期化を行います
/// </summary>
private void SurfaceInitialize()
{
if (secondarySuface_ != null) secondarySuface_.Dispose();
if (primarySurface_ != null) primarySurface_.Dispose();
if (clipper_ != null) clipper_.Dispose();
//サーフィスを作成するための情報
SurfaceCaps caps = new SurfaceCaps();
SurfaceDescription desc = new SurfaceDescription();
//デバイスの協調レベルを設定
device_.SetCooperativeLevel(this, CooperativeLevelFlags.Normal);
//プライマリサーフィスの作成
caps.PrimarySurface = true;
desc.SurfaceCaps = caps;
primarySurface_ = new Surface(desc, device_);
//情報をリセット(セカンダリサーフィスを作るため)
caps.Clear();
desc.Clear();
//セカンダリサーフィスの作成
desc.Width = ClientSize.Width;
desc.Height = ClientSize.Height;
desc.SurfaceCaps = caps;
secondarySuface_ = new Surface(desc, device_);
//クリッパーの作成
clipper_ = new Clipper(device_);
clipper_.Window = this;
//プライマリサーフェスにクリッパーをセット
primarySurface_.Clipper = clipper_;
if (SurfaceChange != null) SurfaceChange(this, new EventArgs());
}
/// <summary>
/// 現在の状態に応じた方法でSurfaceをフリップします
/// </summary>
protected void SurfaceFlip()
{
//非表示時と最小化時は描画しない。(下の2行が無いとエラー起こします)
if (!this.Visible) return;
if (this.WindowState == FormWindowState.Minimized) return;
Rectangle rect = new Rectangle();
rect.Size = this.ClientSize;
rect.Location = this.PointToScreen(this.ClientRectangle.Location);
primarySurface_.Draw(rect, secondarySuface_, DrawFlags.Wait);
}
}
}
ソースコードだけではよく分からない日のために説明。(利都も人のコード説明なしでは読めません。説明があっても読めないコードも存在しますけど)このクラスは初期化を隠蔽しているだけです。本当にそれだけです。
DirectDrawの初期化を行います。
Surfaceの初期化を行います
現在の状態に応じた方法でSurfaceをフリップします
Surfaceが新しく作り替えた時に起こる
説明手抜きですいません。XMLドキュメントをエディタで置き換えかけただけです。(笑)
大きさが変わるたびにSurface作り替えているだけです。その際注意すべきところが一点。前のサーフィスはしっかりとDisposeしましょう。プライマリサーフィスがたくさん出来てしまいます。大変な事になります。(正確にはその前に例外出されます)
継承してください。あとはセカンダリサーフィスがプロテクトで見えているはずなのでそこに描画を行い。最後にSurfaceFlipというかんすうをよびだせばOKです。この関数今は意味がありませんが、後々全画面とウィンドウを切り替えるようになると意味が出てくると思います。