DirectX 3D で Form を表示する

空のプロジェクトから構築して、DirectX 3D でウインドウを表示します。

プロジェクトの設定

  1. DirectX や C# のバージョンによって、画像や説明と多少違うことがあります。
    ホームページの説明は DirectX SDK(December 2006) と Visual Studio Pro 2005 Win32 を使った場合です。
    DirectX のプログラムは、一部を除いて DX.BAT でコンパイルすることが出来ます。
    DX.BAT を使うときは、環境設定もプロジェクトの作成も必要無いのですが、環境に合わせて DX.BAT を修正する必要があります。
    詳細は Command Line から DirectX を参照して下さい。
  2. 今回は Visual Studio のプロジェクトを使うので、DirectX の環境を設定して下さい。
    詳細は Windows Guide を参照して下さい。
    Console Mode と同じように、空のプロジェクトを作成して下さい。
    必要なのは、プロジェクトのフォルダー(DXForm)と DXForm.csproj だけです。
    詳細は Hello C# を参照して下さい。
  3. 次のファイルを格納して、プロジェクトに取り込みます。
    ソリューションエクスプローラのプロジェクト名を右クリックして [追加][既存項目] からソースファイルを選択して下さい。
    /*****************************************/
    /*★ DirectX で Form を表示    前田 稔 ★*/
    /*****************************************/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
    
    namespace DeviceTutorial
    {
        public class CreateDevice : Form
        {
            Device device = null;           // Direct Device の定義
    
            // CreateDevice の Constructor
            public CreateDevice()
            {
                // Window のサイズを設定
                this.ClientSize = new System.Drawing.Size(400,300);
                // caption の設定
                this.Text = "D3D Tutorial 01: CreateDevice";
            }
    
            public bool InitializeGraphics()
            {
                try
                {
                    // Now let's setup our D3D stuff
                    PresentParameters presentParams = new PresentParameters();
                    presentParams.Windowed=true;
                    presentParams.SwapEffect = SwapEffect.Discard;
                    device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
                    return true;
                }
                catch (DirectXException)
                { 
                    return false; 
                }
            }
    
            // OnPaint() から呼ばれる描画処理
            private void Render()
            {
                if (device == null) return;
    
                //Clear the backbuffer to a blue color 
                device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
                //Begin the scene
                device.BeginScene();
    
                // Rendering of scene objects can happen here
    
                //End the scene
                device.EndScene();
                device.Present();
            }
    
            // Window の描画 OnPaint() をオーバーロード
            protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
            {
                this.Render();      // Render on painting
            }
    
            // OnKeyPress() をオーバーロード
            protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
            {
                if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape)
                    this.Close();   // Esc was pressed
            }
    
            //☆ Main() メソッド
            static void Main()
            {
                // using で資源の解放を確実に行う
                using (CreateDevice frm = new CreateDevice())
                {
                    if (!frm.InitializeGraphics())  // Initialize Direct3D
                    {
                        MessageBox.Show("Could not initialize Direct3D.  This tutorial will exit.");
                        return;
                    }
                    frm.Show();
    
                    // メッセージループ
                    while(frm.Created)
                    {
                        frm.Render();
                        Application.DoEvents();
                    }
                }
            }
        }
    }
    
  4. ソリューション・エクスプローラーで「参照設定」を右クリックして「参照の追加」を選択します。
    以下のファイル(DLL) を追加して下さい。
    DirectX 関係のファイルは DirectX SDK をインストールすると表示されます。
    Microsoft.DirectX
    Microsoft.DirectX.Direct3D
    Microsoft.DirectX.Direct3DX
    System
    System.Drawing
    System.Windows.Forms

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

  6. メニューの [デバッグ] から [デバッグ開始] または [デバッグなしで開始] を選択すればコンパイルされ、エラーが無ければ実行されます。
    [コンパイル&実行] はツールバーから起動する方が簡単です。

プログラムの説明

  1. Main() メソッドで Device を生成して frm に格納します。
    using は有効範囲を限定して、資源の解放を確実に行うために使います。
        static void Main()
        {
            // using で資源の解放を確実に行う
            using (CreateDevice frm = new CreateDevice())
            {
        
  2. DirectX3D の初期化を行うメッソドを呼び出します。
    失敗したら MessageBox を表示して終了です。
        if (!frm.InitializeGraphics())  // Initialize Direct3D
        {
            MessageBox.Show("Could not initialize Direct3D.  This tutorial will exit.");
            return;
        }
        
  3. Frame を表示してメッセージループに入ります。
    frm.Render() で Frame を描画するメソッドを呼び出します。
    Application.DoEvents() で Events の発生を調べます。
        frm.Show();
    
        // メッセージループ
        while(frm.Created)
        {
            frm.Render();
            Application.DoEvents();
        }
        
  4. CreateDevice Class は Form を継承しています。
    Device device は DirectX Device の定義です。
    Constructor で Window のサイズとキャプションを設定します。
        public class CreateDevice : Form
        {
            Device device = null;           // Direct Device の定義
    
            // CreateDevice の Constructor
            public CreateDevice()
            {
                // Window のサイズを設定
                this.ClientSize = new System.Drawing.Size(400,300);
                // caption の設定
                this.Text = "DirectX CreateDevice";
            }
        
  5. DirectX3D の初期化を行う InitializeGraphics() です。
    new PresentParameters() で現在の動作モードを取得します。
    new Device() で DirectX の Device を取得します。
    失敗したとき(catch) は false; をリターンします。
            public bool InitializeGraphics()
            {
                try
                {
                    // Now let's setup our D3D stuff
                    PresentParameters presentParams = new PresentParameters();
                    presentParams.Windowed=true;
                    presentParams.SwapEffect = SwapEffect.Discard;
                    device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
                    return true;
                }
                catch (DirectXException)
                {
                    return false; 
                }
            }
        
  6. Frame に描画するメソッドです。
    メッセージループや OnPaint() から呼び出されます。
    このプログラムでは Clear() で Frame をクリアするだけです。
        private void Render()
        {
            if (device == null) return;
    
            //Clear the backbuffer to a blue color 
            device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
            //Begin the scene
            device.BeginScene();
    
            // Rendering of scene objects can happen here
    
            //End the scene
            device.EndScene();
            device.Present();
        }
        
  7. 描画メソッド OnPaint() をオーバーロードして Render() メソッドを呼び出します。
            // Window の描画 OnPaint() をオーバーロード
            protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
            {
                this.Render();      // Render on painting
            }
        
  8. OnKeyPress() をオーバーロードして Escape キーで終了します。
            // OnKeyPress() をオーバーロード
            protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
            {
                if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape)
                    this.Close();   // Esc was pressed
            }
        

必要最小限のファイル

DirectX のプロジェクト(DXForm) の最低限必要なファイルは次のとおりです。
新しいプロジェクトを作成する場合、このプロジェクトをフォルダーごとコピーして、フォルダー名を変更すると便利です。
プロジェクトファイルやソースファイルの名前を変更するときは、メモ帳で *.csproj に記述されている名前を変更すればOKです。 0(^_^)0
ファイル(フォルダー) 説明
DXForm.csproj プロジェクトファイル
DXForm.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 のモードになります。

  3. これで、以前作成した DirectX のプロジェクトが動くようになりました。 ヽ(^^ )

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