DirectXになっても基本のウインドウはほとんど変わりません。 Direct3Dを使用するための初期化が必要になるだけです。
#include <windows.h>
#include <d3dx9.h>
//---------------------------------------------------------------------------//
//プロトタイプ宣言
//---------------------------------------------------------------------------//
HRESULT InitD3d(HWND hWnd);
VOID Render(HWND hWnd);
VOID FreeDx();
//---------------------------------------------------------------------------//
//オブジェクトの開放マクロ
//---------------------------------------------------------------------------//
#define SAFE_RELEASE(p) if(p){(p)->Release(); (p) = NULL;}
//---------------------------------------------------------------------------//
//オブジェクト宣言
//---------------------------------------------------------------------------//
LPDIRECT3D9 pD3d; //Direct3Dオブジェクト
LPDIRECT3DDEVICE9 pDevice; //Direct3Dデバイスオブジェクト
//---------------------------------------------------------------------------//
//DirectX初期化処理
//---------------------------------------------------------------------------//
HRESULT InitD3d(HWND hWnd)
{
//Direct3Dオブジェクトの作成
//D3D_SDK_VERSION : そのマシンに設定されたDirectXのヴァージョンを取得する
if(NULL == (pD3d = Direct3DCreate9(D3D_SDK_VERSION)))
{
MessageBox(hWnd, "Direct3Dの作成に失敗しました",
"Error", MB_OK);
return E_FAIL;
}
//Direct3Dデバイスオブジェクトの設定
D3DPRESENT_PARAMETERS d3dpp; //描画情報構造体
ZeroMemory(&d3dpp, sizeof(d3dpp));
//バックバッファフォーマット
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //デフォルト
d3dpp.BackBufferCount = 1; //バックバッファの数
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //スワップの設定
d3dpp.Windowed = TRUE; //ウインドウモードの設定
//デバイスの作成
//HAL(頂点処理:ハードウェア)
if(FAILED(hr = m_pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pDevice)))
{
//HAL(頂点処理:ソフトウェア)
if(FAILED(hr = m_pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pDevice)))
{
MessageBox(hWnd, "HALモードでDirect3Dデバイスの作成に失敗:REFモードで実行します",
"Error", MB_OK);
//REF(頂点処理:ハードウェア)
if(FAILED(hr = m_pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pDevice)))
{
//REF(頂点処理:ソフトウェア)
if(FAILED(hr = m_pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pDevice)))
{
MessageBox(hWnd, "REFモードでDirect3Dデバイスの作成に失敗",
"Error", MB_OK);
return hr;
}
}
}
}
//ライトをオフにする
pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
return hr;
}
初期化関数が出来ました。後はmain関数内に放り込むだけです。
//-----------------------------------------------------------------------------
// WindowProc()
// ウインドウ関数
//-----------------------------------------------------------------------------
LRESULT CALLBACK WindowProc(
HWND hWnd, // ウインドウハンドル
UINT uMsg, // メッセージ
WPARAM wParam, // メッセージに対する情報
LPARAM lParam) { // メッセージに対する情報
//--メッセージ別の処理
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
}
return 0;
}
// メインに返す情報
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(
HINSTANCE hInstance, //インスタンス番号
HINSTANCE hPrevInstance,
PSTR lpCmdLine,
int nCmdShow)
{
//---------------中略---------------//
//DirectX初期化
if(FAILED(InitD3d(hWnd)))
{
MessageBox(hWnd, "DirectXの初期化に失敗しました。",
"ERROR", MB_OK);
return 0;
}
ZeroMemory(&msg, sizeof(msg)); //msg初期化
while(msg.message != WM_QUIT)
{
//Windowメッセージの取得
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
{
//メッセージを変換する
TranslateMessage(&msg);
//ウインドウ関数にメッセージを送る
DispatchMessage(&msg);
}
else
{
//レンダリング関数
Render();
}
}
//オブジェクトの開放処理
FreeDx();
}
初期化が出来ました。次は描画です。描画の更新はRender関数で行います。
//---------------------------------------------------------------------------//
//レンダリング関数
//---------------------------------------------------------------------------//
VOID Render()
{
//画面の初期化
pDevice->Clear(0, NULL,
D3DCLEAR_TARGET,
D3DCOLOR_XRGB(100, 100, 100), //初期化時の色
1.0f,0);
if(SUCCEEDED(pDevice->BeginScene())) //描画開始
{
pDevice->EndScene(); //描画終了
}
//フリップ(バックバッファを表に出す)
pDevice->Present(NULL, NULL, NULL, NULL);
}
最後に後片付け。
//オブジェクト開放関数
VOID FreeDx()
{
SAFE_RELEASE(pDevice);
SAFE_RELEASE(pD3d);
}
WinAPIのみと比べると少々長くなりました。しかし初期化はほぼ変更することは無いので、 一度打ってしまえば後はコピー&ペーストです。