~プログラミング~ DirectX 11をMFCアプリケーションで使ってみる

マイクロソフトはVirual C++用にMFCライブラリというものを提供してくれています。

 

MFCではメッセージハンドラやウインドウフレームワークなどの基本的な部分をパッケージ化してくれているので、Windowsアプリケーションを作成がとても楽になります。

 

MFCライブラリを使ったアプリケーションから DirectX 11 を利用する方法について考えてみます。

 

右の図のような三角形を表示するアプリケーションです。

アプリケーションのウインドウはMFCのテンプレートを使って作成し、そのウインドウ内の描画を DirectX 11 を使って行っています。

 

三角形を描画する部分は以下の記事も参考にしてみてください

~プログラミング~ DirectX 11で三角形を表示しよう

プロジェクトを作成する

作成するプロジェクトは「MFCアプリケーション」テンプレートを使って作成してみる事にします。

※Visual Studioを使って開発する事を前提としています

ウインドウの作成などをコードを書くことなくウィザードを進めていくだけで作れるので楽ちんです。

アプリケーションの種類では「シングル ドキュメント(S)」を選びます。

その他でも作ることは出来ますが、DirectXを使うアプリと言えば大体シングル ドキュメントになると思うので。

 

また、「ドキュメント/ビュー アーキテクチャのサポート(V)」のチェックは外しています。

これを使うほどのアプリではないしソースが複雑になるので。

システムメニューやステータスバーの有無などもウィザードで選択するだけ。

完了すると以下のような名前のクラスが出来上がってきます。

  • CMFCxDX11App  ・・・ メインウインドウの作成から終了までを管理する。(プロジェクト名のクラス)
  • CMainFrame     ・・・メインウインドウのクラス。メニュー・ステータスバー・描画エリアなどを管理する。 
  • CChildView    ・・・ 描画エリアを管理するクラス。

DirectX 11ライブラリのインクルード

DirectX のライブラリを参照できるように、ヘッダーファイルなどのインクルードを行います。

stdafx.hファイルの一番最後に以下の定義を書き加えていきます。

  :
  :
  :

#include <d3d11.h>
#pragma comment(lib, "d3d11.lib")

DirectX で三角形を描画するクラスを作成

CChildViewクラスなどにコードを書き加えていってもいいのかもしれませんが別クラスで作っています。

 

三角形を描画する部分は以下の記事を参照してください。

~プログラミング~ DirectX 11で三角形を表示しよう

~プログラミング~ DirectX 11で三角形を表示しよう(ソースコード)

 

ヘッダーファイルとソースファイル

ヘッダーファイルとソースファイルの作成は「ソリューションエクスプローラ」から追加するのが簡単かと思います。

 

.hファイルは「ヘッダーファイル」フォルダを右クリックして、

.cppファイルは「ソースファイル」フォルダを右クリックしてから

「追加(D)」→「新しい項目(W)...」を選んでファイルを作成していきます。

シェーダーファイル

頂点シェーダーとピクセルシェーダーもそれそれ作成します。

 

シェーダーファイルの作成とコンパイルについては以下を参照してください。

~プログラミング~ DirectX 11でシェーダーをコンパイルしよう

 

コンパイル時に「/Fh」オプションを使うとヘッダーファイルが作成されます。

出来上がったファイルはプロジェクトフォルダへ格納します。

ヘッダーファイルをインクルード

作成したヘッダーファイルをプロジェクトが参照できるようインクルードします。

stdafx.hファイルの一番最後に以下の定義を書き加えていきます。

  :
  :
  :


#include <d3d11.h>
#pragma comment(lib, "d3d11.lib")


#include "vs_test.h"
#include "ps_test.h"
#include "CD3DTest.h"

DirectX の初期化から表示まで

インスタンスの作成

先ずは自作したCD3DTestクラスのインスタンスを作成します。

描画エリアのウインドウを管理するCChildViewクラスのメンバ変数として持たせます。

class CChildView : public CWnd
{
public:
    CD3DTest m_D3D;      //←ココを追加 


  :
  :
}

DirectXの初期化

本来ならCChildViewが作成される時(onCreateメソッドの中)でDirectXの初期化をしたいところですが、この時はウインドウサイズが0な状態なため、サイズ変更時「OnSizeメソッドの中」で行うようにしています。

※DirectX初期化時に作成しているバックバッファをウインドウサイズと同じにしたい為

 

 

ChildView.hを開いてからプロパティウインドウを表示し、「WM_SIZE」メッセージに応答するOnSizeメソッドを追加します。

 

 

OnSizeメソッドへ以下のように初期化のためのコードを書き加えていきます。

void CChildView::OnSize(UINT nType, int cx, int cy)
{
        CWnd::OnSize(nType, cx, cy);

        if ( ( 0 < cx ) && ( 0 < cy ) ) {
                if (NULL == m_D3D.m_pDevice) {
                        m_D3D.Create( m_hWnd );
                }
        }
}

※エラー処理だったり再度ウインドウサイズを変えられた場合の処理が無いなど足りない部分の多いコードですが。

描画する

通常なら秒間数十フレームという速度で描画し続ける作りにするところですが、今回は取りあえず必要な時だけ表示するという感じにしています。

 

ウインドウの再描画が必要な時にポストされるWM_PAINTメッセージで描画を行います。

void CChildView::OnPaint() 
{
        CPaintDC dc(this); // 描画のデバイス コンテキスト
        
        m_D3D.Render();
}