/* 需要包含以下库 d3d9.lib d3dx9.lib winmm.lib */ #include <d3dx9.h> namespace d3d { bool InitD3D(HWND hwd, HINSTANCE hInstance, //[in]应用程序实例 int width, int height,//[in]Back buffer尺寸 bool windowed, //[in]是否全屏 D3DDEVTYPE deviceType,//[in]HAL or REF IDirect3DDevice9** device); //[out]创建的设备 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int EnterMsgLoop(bool(*ptr_display)(float timeDelta)); template<class T> void Release(T t) { if (t) { t->Release(); t = 0; } } template<class T> void Delete(T t) { if (t) { delete t; t = 0; } } }
#include "stdafx.h" #include "d3dUtility.h" bool d3d::InitD3D(HWND hwd, HINSTANCE hInstance, //[in]应用程序实例 int width, int height,//[in]Back buffer尺寸 bool windowed, //[in]是否全屏 D3DDEVTYPE deviceType,//[in]HAL or REF IDirect3DDevice9** device) //[out]创建的设备 { // ***第一步,获得IDirect3D9接口 IDirect3D9* _d3d9; _d3d9 = Direct3DCreate9(D3D_SDK_VERSION); if (_d3d9 == NULL) return false; // ***第二步,检查设备能力 D3DCAPS9 caps; _d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, //主显示设备 deviceType, //设备类型 &caps); //是否支持使用硬件顶点处理? int vp = 0; if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) { //是,支持硬件顶点处理 vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; } else { //不,只能用软件顶点处理 vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; } //***第三步,初始化D3DPRESENT_PARAMETERS结构 D3DPRESENT_PARAMETERS d3dpp; d3dpp.BackBufferWidth = width; d3dpp.BackBufferHeight = height; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //像素格式 d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwd; d3dpp.Windowed = windowed; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //***第四步,创建IDirect3DDevice9对象 HRESULT hr = _d3d9->CreateDevice(D3DADAPTER_DEFAULT, deviceType, hwd, vp, &d3dpp, device); if (FAILED(hr)) { ::MessageBox(0, "CreateDevice() - FAILED", 0, 0); return false; } return true; } LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: ::PostQuitMessage(0); break; case WM_KEYDOWN: if (wParam==VK_ESCAPE) ::PostQuitMessage(0);//::DestoryWindow(hwnd); break; } return ::DefWindowProc(hwnd, msg, wParam, lParam); } int d3d::EnterMsgLoop(bool(*ptr_display)(float timeDelta)) { MSG msg; ::ZeroMemory(&msg, sizeof(MSG)); static float lastTime = 0; //(float)timeGetTime(); while (msg.message!=WM_QUIT) { if (::PeekMessage(&msg,0,0,0,PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } else { float currTime = 0; //(float)timeGetTime(); float timeDelta = (currTime - lastTime)*0.001f; ptr_display(timeDelta); lastTime = currTime; } } return msg.wParam; }