Direct Draw でウインドウを表示

C# の Direct Draw で空のウインドウを表示します。
Direct Draw は DirectX8 から3Dに吸収された機能ですが、C#ではまだまだ使うことが出来ます。 (^_^;
3Dに比べてプログラミングも容易で描画速度も速く、3D機能を使わないのであればお勧めです。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの作成

  1. 使用するソフトウエアのバージョンによって、画像や説明と多少違うことがあります。
    このページの説明は DirectX SDK(December 2006) と Visual Studio Pro 2005 Win32 を使った場合です。
    December 2006 には DirectX9 と DirectX10 が格納されていますが、ここで使うのは DirectX9 です。
    DirectX のプログラムは、一部を除いて DX.BAT でコンパイルすることが出来ます。
    DX.BAT を使うときは、環境設定もプロジェクトの作成も必要無いのですが、環境に合わせて DX.BAT を修正する必要があります。
    詳細は Command Line から DirectX を実行 を参照して下さい。
  2. 今回は Visual Studio のプロジェクトを使うので、DirectX の環境を設定して下さい。
    詳細は Windows Guide を参照して下さい。
    Console Mode と同じように、空のプロジェクト(DRForm)を作成して下さい。
    必要なのは、プロジェクトのフォルダー(DRForm)と DRForm.csproj だけです。
    詳細は Hello C# を参照して下さい。
  3. 次のファイルを格納して、プロジェクトに取り込みます。
    ソリューションエクスプローラのプロジェクト名を右クリックして [追加][既存項目] からソースファイルを選択して下さい。
    /*********************************************/
    /*★ Direct Draw で Form を表示    前田 稔 ★*/
    /*********************************************/
    using System;
    using System.Drawing;
    using System.ComponentModel;
    using System.Windows.Forms;
    using Microsoft.DirectX;
    using Microsoft.DirectX.DirectDraw;
    
    namespace DXDraw
    {
        public class DXDraw : System.Windows.Forms.Form
        {
            private Device draw = null;         // DrawDevice object.
    
            public DXDraw()
            {
                this.Text = "Dirext Draw";
                this.Resize += new System.EventHandler(this.DXDraw_SizeChanged);
                this.SizeChanged += new System.EventHandler(this.DXDraw_SizeChanged);
                this.Paint += new System.Windows.Forms.PaintEventHandler(this.DXDraw_Paint);
    
                draw = new Device();
                draw.SetCooperativeLevel(this, CooperativeLevelFlags.Normal);
            }
    
            //☆ Main() メソッド
            static void Main() 
            {
                using(DXDraw mf = new DXDraw())
                {   Application.Run(mf);
                }
            }
    
            private void DXDraw_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
            {
                Draw();
            }
    
            private void DXDraw_SizeChanged(object sender, System.EventArgs e)
            {
                Draw();
            }
    
            private void Draw()
            {
            }
        }
    }
    
  4. ソリューション・エクスプローラーで「参照設定」を右クリックして「参照の追加」を選択します。
    以下のファイル(DLL) を追加して下さい。
    DirectX 関係のファイルは DirectX SDK をインストールすると表示されます。
    Microsoft.DirectX
    Microsoft.DirectX.DirectDraw
    System
    System.Drawing
    System.Windows.Forms

  5. ソリューション・エクスプローラでプロジェクト名を右クリックして「プロパティ」を選択します。
    「出力の種類」を「Windowsアプリケーション」にします。
    またはメニューからプロジェクトのプロパティで「出力の種類」を「Windowsアプリケーション」にします。

  6. メニューの [デバッグ] から [デバッグ開始] または [デバッグなしで開始] を選択すればコンパイルされ、エラーが無ければ実行されます。
    次のエラーが表示されたときは、ページ後部の【NOTE】を参照して下さい。
    BadImageFormatException はハンドルされませんでした。
    [コンパイル&実行] はツールバーから起動する方が簡単です。

プログラムの説明

  1. Main() メソッドで DXDraw Object Class を生成して制御を渡します。
    using は DXDraw Object Class の範囲を指定して、範囲から出ると資源を解放するためのコードです。
        static void Main() 
        {
            using(DXDraw mf = new DXDraw())
            {   Application.Run(mf);
            }
        }
        
  2. draw は Direct Draw Device の定義です。
        private Device draw = null;         // DrawDevice object.
        
  3. DXDraw の Constructor でキャプションを設定します。
    SizeChanged はウインドウサイズが変更されたときに呼び出されるイベントハンドラです。
    Paint はウインドウの描画を行うイベントハンドラです。
    new Device() で Direct Draw のデバイスを生成します。
    SetCooperativeLevel で Windowed Mode に設定します。
        public DXDraw()
        {
            this.Text = "Dirext Draw";
            this.Resize += new System.EventHandler(this.DXDraw_SizeChanged);
            this.SizeChanged += new System.EventHandler(this.DXDraw_SizeChanged);
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.DXDraw_Paint);
    
            draw = new Device();
            draw.SetCooperativeLevel(this, CooperativeLevelFlags.Normal);
        }
        
  4. Draw() 関係のメソッドで描画するのですが、ウインドウの枠を表示するだけなので何も書かれていません。
  5. DirectX のプロジェクト(DRForm) の最低限必要なファイルは次のとおりです。
    新しいプロジェクトを作成する場合、このプロジェクトをフォルダーごとコピーして、フォルダー名を変更すると便利です。
    プロジェクトファイルやソースファイルの名前を変更するときは、メモ帳で *.csproj に記述されている名前を変更すればOKです。 0(^_^)0
    ファイル(フォルダー) 説明
    DRForm.csproj プロジェクトファイル
    DRForm.cs ソースプログラムファイル

【NOTE】

以前作成した DirectX のプロジェクトが、実行時にエラーメッセージが表示されて動かなくなりました。 (^_^;)
現在の実行環境は Windows7 & Visual Studio .NET 2005 & DirectX November2008 です。
  1. エラーメッセージ
    BadImageFormatException はハンドルされませんでした。
  2. 原因
    Windows7 で C# を使ったときの既定値は 64bit で DirectX の DLL(32bit)を呼び出すことが出来ません。
    そこで C# で DirectX を組む時は 32bit に設定します。
    1. Any CPU の右のリストボックスをクリックして、構成マネージャを呼び出します。
    2. <新規作成>から X86 を作成します。
    3. 元の画面に戻ると、Any CPU が X86 に変わり 32bit のモードになります。

    これで、以前作成した DirectX のプロジェクトが動くようになりました。 ヽ(^^ )
  3. 2014/08/08 デスクトップモードで DirectX を動かしてみました。
    Windows 8.1 ですがストアアプリでは無いので念のため。
    ストアアプリの DirectX は 超初心者のプログラム入門(DirectX Windows8) を参照して下さい。
    Windows 8.1 + DirectX9 の環境でC#で作成した DirectX の実行を確認しました。
    DirectX9 をインストールしてインクルードファイルとライブラリファイルのパスを設定して下さい。
    CPU モードを X86 に設定して下さい。
    C# Direct Draw, C# DirectX Sprite, C# DirectX 3D から幾つか選んで実行を確認しました。

超初心者のプログラム入門(C# Frame Work)