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のみと比べると少々長くなりました。しかし初期化はほぼ変更することは無いので、 一度打ってしまえば後はコピー&ペーストです。