[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectXDraw>全画面表示

全画面表示

全画面表示を行います。でも、その前に一つ。終了できなくなったら、「Alt+F4」でお願いします。

今回のソースコード

全画面表示を行うに当たっ2カ所書き換えが必要になります。

        //ここが心臓部DirectDrawの初期化
private void directDrawInitialize()
{
// フォームのボーダーをなしにする(フォームの初期化の方を書き換えてもよい)
this.FormBorderStyle = FormBorderStyle.None;

//デバイスを作成
device_ = new Device();

//デバイスの協調レベルを設定
//ウィンドウモードと設定が違うので注意
device_.SetCooperativeLevel(this, CooperativeLevelFlags.FullscreenExclusive);

//ディスプレイモードを指定
device_.SetDisplayMode(clientWight, clientHeight, 16, 0, false);

//サーフィスを作成するための情報
SurfaceCaps caps = new SurfaceCaps();
SurfaceDescription desc = new SurfaceDescription();

//プライマリサーフィスの作成
caps.PrimarySurface = true;
caps.Flip = true;
caps.Complex = true;
desc.SurfaceCaps = caps;
desc.BackBufferCount = 1;
primarySurface_ = new Surface(desc, device_);

//情報をリセット(セカンダリサーフィスを作るため)
caps.Clear();

//セカンダリサーフィスの作成
caps.BackBuffer = true;
secondarySuface_ = primarySurface_.GetAttachedSurface(caps);

//クリッパーは使わない
clipper_ = null;

}
        private void timer__Tick(object sender, EventArgs e)
{
//非表示時と最小化時は描画しない。(下の2行が無いとエラー起こします)
if (!this.Visible) return;
if (this.WindowState == FormWindowState.Minimized) return;

//真っ黒に塗る
secondarySuface_.ColorFill(Color.Black);

//線の情報と塗り潰しの色を指定する。
secondarySuface_.ForeColor = Color.Yellow;

secondarySuface_.DrawText(100, 100, "文字を描くtrue", true);
secondarySuface_.DrawText(100, 100, "文字を描くfalse", false);

primarySurface_.Flip(secondarySuface_, FlipFlags.Wait);

}

以上2カ所。初期化と描画の所をちょっといじればできあがりです。各自じっくりとソースコードを読んで確認してください。

協調モード

書き換えてください。Normalのままだとエラーを起こされます。

SetDisplayMode

何とこれをいじるだけで画面のモードが変わります。不可能なモードにチェンジしようとしないでください。

サーフィスの作成

全般的にコードが書き分かっています。まず「Flip」ですが、「裏返す」という意味があります。つまり、バックバッファと切り替える事を可能にするためのフラグです。確かウィンドウモードの時はセカンダリからプライマリへと情報の転送を行っていたはずです。今回は別な方法で切り替えるわけです。それに伴ってバックバッファの数とセカンダリサーフィスの作成の作成の仕方が変わっています。

クリッパーは未使用

あの謎のクリッパー。使用しなくて良いようです。

Flipメソッド

セカンダリサーフィスとの裏返しを行っています。これを行うと、セカンダリがプライマリにプライマリがサーフィスになります。(つまり裏返し)




まとめたコード

using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectDraw;

namespace DDrawTest2
{
class DDrawTest : Form
{
//クライアント領域のサイズ
const int clientHeight = 600;
const int clientWight = 800;

public DDrawTest()
: base()
{
//固定サイズのフォーム
this.FormBorderStyle = FormBorderStyle.FixedSingle;
//サイダかボタン無し
this.MaximizeBox = false;
//クライアント領域サイズ
this.ClientSize = new Size(clientWight, clientHeight);

this.directDrawInitialize();
this.timer_ = new Timer();
timer_.Interval = 100;
timer_.Tick += new EventHandler(timer__Tick);
timer_.Start();

}

private Device device_;
private Surface primarySurface_;
private Surface secondarySuface_;
private Clipper clipper_;

//ここが心臓部DirectDrawの初期化
private void directDrawInitialize()
{
// フォームのボーダーをなしにする
this.FormBorderStyle = FormBorderStyle.None;

//デバイスを作成
device_ = new Device();

//デバイスの協調レベルを設定
//ウィンドウモードと設定が違うので注意
device_.SetCooperativeLevel(this, CooperativeLevelFlags.FullscreenExclusive);

//ディスプレイモードを指定
device_.SetDisplayMode(clientWight, clientHeight, 16, 0, false);

//サーフィスを作成するための情報
SurfaceCaps caps = new SurfaceCaps();
SurfaceDescription desc = new SurfaceDescription();

//プライマリサーフィスの作成
caps.PrimarySurface = true;
caps.Flip = true;
caps.Complex = true;
desc.SurfaceCaps = caps;
desc.BackBufferCount = 1;
primarySurface_ = new Surface(desc, device_);

//情報をリセット(セカンダリサーフィスを作るため)
caps.Clear();

//セカンダリサーフィスの作成
caps.BackBuffer = true;
secondarySuface_ = primarySurface_.GetAttachedSurface(caps);

//クリッパーは使わない
clipper_ = null;

}

private Timer timer_;

private void timer__Tick(object sender, EventArgs e)
{
//非表示時と最小化時は描画しない。(下の2行が無いとエラー起こします)
if (!this.Visible) return;
if (this.WindowState == FormWindowState.Minimized) return;

//真っ黒に塗る
secondarySuface_.ColorFill(Color.Black);

//線の情報と塗り潰しの色を指定する。
secondarySuface_.ForeColor = Color.Yellow;

secondarySuface_.DrawText(100, 100, "文字を描くtrue", true);
secondarySuface_.DrawText(100, 100, "文字を描くfalse", false);

primarySurface_.Flip(secondarySuface_, FlipFlags.Wait);
}
}

class Program
{
public static void Main(string[] argv)
{
Application.Run(new DDrawTest());
}
}
}



まあこんなモンで出来てしまいました。あとはあなたの工夫次第。マイクロソフトがサポートを止めるまで可能性は無限大。(未来がないのに可能性も何もないですね)


ページの一番上へ
前のページへ 一覧に戻る 次のページへ
初版2006-3-5 最終更新2006-3-6
[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectXDraw>全画面表示