[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectXDraw>大きさを変えられるウィンドウ

大きさを変えられるウィンドウ

ウィンドウの大きさを変えられるクラスを作ってみました。と言っても大きさが変わるたびにサーフィスを再構築しているだけです。

今回のソースコード

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

}


}

このクラスの概要

ソースコードだけではよく分からない日のために説明。(利都も人のコード説明なしでは読めません。説明があっても読めないコードも存在しますけど)このクラスは初期化を隠蔽しているだけです。本当にそれだけです。

M:MDDraw.DirectDrawForm.directDrawInitialize

DirectDrawの初期化を行います。

M:MDDraw.DirectDrawForm.SurfaceInitialize

Surfaceの初期化を行います

M:MDDraw.DirectDrawForm.SurfaceFlip

現在の状態に応じた方法でSurfaceをフリップします

E:MDDraw.DirectDrawForm.SurfaceChange

Surfaceが新しく作り替えた時に起こる


説明手抜きですいません。XMLドキュメントをエディタで置き換えかけただけです。(笑)

ウィンドウの大きさを変えられるわけ

大きさが変わるたびにSurface作り替えているだけです。その際注意すべきところが一点。前のサーフィスはしっかりとDisposeしましょう。プライマリサーフィスがたくさん出来てしまいます。大変な事になります。(正確にはその前に例外出されます)

使い方

継承してください。あとはセカンダリサーフィスがプロテクトで見えているはずなのでそこに描画を行い。最後にSurfaceFlipというかんすうをよびだせばOKです。この関数今は意味がありませんが、後々全画面とウィンドウを切り替えるようになると意味が出てくると思います。


一覧に戻る
初版2006-3-6
[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectXDraw>大きさを変えられるウィンドウ