フルカラービットマップ画像を表示する

DirectX の CreateSurfaceFromBitmap で画像を格納した Surface を生成して描画します。
ゲームプログラムと言えば、何と言っても画像が基本です。
FullScreenMode でフルカラー(24ビット)の画像を表示してみましょう。 \(^o^)/
画像は何でも良いので、適当なサイズのフルカラー BMP 画像を調達してきて下さい。

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

プロジェクトの作成

  1. 事前に DirectX9 をインストールしてパスの設定を行って下さい。
    インストールとパスの設定は DirectX9 のインストール を参照して下さい。
  2. 新規プロジェクト(Bmp)を作成して下さい。
    プロジェクトの作成方法は 文字列の Surface を描画する を参照して下さい。
  3. 次のファイルを Bmp のフォルダーに格納して下さい。
    ソースプログラムは、プログラムの説明を参考にして作成して下さい。
    [c:\DXSDK\]は DirectX9 がインストールされているフォルダーです。
    ddutil.cpp は DirectX の2D汎用関数のソースファイルで[c:\DXSDK\]に格納されています。
    プロジェクト/既存項目の追加から格納したファイルをプロジェクトに追加して下さい。
    ☆DirectX9 の新しいバージョンでは、2D関係のソースファイルが無くなっています。 (;_;)
    見つからないときは、ここから Object Class Library から取得して下さい。
    ファイル名 ファイルの説明
    Bmp.cpp ソースプログラム
    ddutil.cpp c:\DXSDK\Samples\C++\Common\Src
    ddutil.h c:\DXSDK\Samples\C++\Common\Include
    dxutil.h c:\DXSDK\Samples\C++\Common\Include
  4. プロジェクト/プロパティからリンカ/入力/追加する依存関係で、次のライブラリ名をタイプして OK をクリックします。
    .NET2005 では Hello のプロパティから[構成プロパティ][リンカ][入力]を選択します。
    dxguid.lib
    ddraw.lib
    dxerr9.lib
  5. ビルドから実行を選ぶと、コンパイルに続いて実行が行われます。
    ページ先頭の画面が表示されたら完成です。
    2014/08/11 DirectX November 2008(DirectX9)で実行を確認しました。

プログラムの説明

DirectDraw の global 領域です。
Display と 画像を格納する Surface(描画に使用するメモリ領域)です。
g_bActive は DirectDraw の初期化成功のフラグです。
bmpfile[] は表示する BMP 画像ファイルの名前です。
CDisplay*   g_pDisplay    = NULL;
CSurface*   g_pBmpSurface = NULL;
BOOL        g_bActive     = FALSE; 
char        bmpfile[]=    "c:\\DXSDK\\Samples\\Media\\env3.bmp";

基本的には前と同じですが Window を初期化するソースコードをコンパクトにまとめて見ました。
文字列の Surface を描画する と比較してみて下さい。
    // Set up and register window class
    WNDCLASS wc = { CS_CLASSDC,WndProc,0L,0L,hInst,NULL,LoadCursor(NULL,IDC_ARROW),
                    (HBRUSH)GetStockObject(WHITE_BRUSH),NULL,NAME
                  };
    if (RegisterClass(&wc)==0)    return FALSE;
    // Create a window
    hWnd= CreateWindow(NAME,NAME,WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
            NULL,NULL,hInst,NULL);
    if (!hWnd)  return FALSE;

DirectDraw を初期化するコードです。
「640, 480, 16」は画面の横幅と高さとカラーモードです。
初期化に失敗したらエラーメッセージを表示してリターンします。
次に BMP Surface(描画に使用するメモリ領域)を生成して画像イメージを格納します。
(&g_pBmpSurface,bmpfile,0,0))) の「0,0」は画像を格納する Surface の幅と高さですが、ゼロを指定すると入力画像の サイズに合わせてくれます。
Bit Map Surface の詳しい説明は directX7 の「背景画像をスクロールする」を参照して下さい。
HRESULT InitDirectDraw(HWND hWnd)
{   HRESULT             hr;

    g_pDisplay = new CDisplay();
    if (FAILED(hr = g_pDisplay->CreateFullScreenDisplay(hWnd,640,480,16)))
    {   ERMSG("This display card does not support 640x480x16.");
        return hr;
    }

    // Create a surface, and draw a bitmap resource on it.  
    if (FAILED(hr = g_pDisplay->CreateSurfaceFromBitmap
                       (&g_pBmpSurface,bmpfile,0,0)))
        return hr;
    return S_OK;
}

Message Loop です。
Message が到着していないときは DisplayFrame() 関数で画面の描画を行います。
DirectX では、たとえ表示内容が同じでも毎回 Surface をクリアして画像を生成し、垂直同期信号に合わせて 画面を切り替えるのが基本です。
    while(TRUE)
    {   if (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
        {   if (0 == GetMessage(&msg,NULL,0,0)) return (int)msg.wParam;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {   if (g_bActive)
            {   if (FAILED(DisplayFrame()))
                {   SAFE_DELETE(g_pDisplay);
                    ERMSG("Displaying the next frame failed. The sample will now exit.");
                    return FALSE;
                }
            }
            else    WaitMessage();
        }
    }

描画を行うコードです。
Clear() で DisplaySurface をクリアします。
Clear(RGB(255,0,0)) のようにクリアする色を R,G,B(0~255) で指定することもできます。
Blt() で画像を描画します。
Present() でフレームを切り替えます。
HRESULT DisplayFrame()
{   HRESULT hr;

    // Fill the back buffer with black, ignoring errors until the flip
    g_pDisplay->Clear(0);
    // Blt all the sprites onto the back buffer using color keying,
    g_pDisplay->Blt(0,0,g_pBmpSurface,NULL);
    // We are in fullscreen mode, so perform a flip and return 
    if (FAILED(hr=g_pDisplay->Present()))   return hr;
    return S_OK;
}

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(DirectX9 game program)