//包含Dx9的頭文件
#include <d3d9.h>
#pragma warning( disable : 4996 ) //除去警告
#include <strsafe.h>
#pragma warning( default : 4996 )
//-----------------------------------------------------------------------------
// 全局參數
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; // 創建 D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 我們使用的渲染設備
//-----------------------------------------------------------------------------
// 名稱: InitD3D()
// 描述: 初始化 Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D(HWND hWnd)
{
// 根據版本創建D3D對象
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
//設置參數
D3DPRESENT_PARAMETERS d3dpp; //參數對象,用於下面的設備創建
ZeroMemory(&d3dpp, sizeof(d3dpp)); //用0來填充d3dpp內存區域,也就是初始化內存
d3dpp.Windowed = TRUE; //設置爲窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //交換緩衝支持的效果類型,指定表面在交換鏈中是如何被交換的。這裏爲後備的緩存加載之後就刪除。
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //顯示模式
//創建設備驅動Direct3D
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, //默認適配器
D3DDEVTYPE_HAL, //硬件驅動
hWnd, //設備所使用的窗體
D3DCREATE_SOFTWARE_VERTEXPROCESSING, //頂點像素渲染方式
&d3dpp, //參數
&g_pd3dDevice //驅動設備
)))
{
return E_FAIL;
}
// 初始化完成
return S_OK;
}
//-----------------------------------------------------------------------------
// 名稱: Cleanup()
// 描述: 釋放所有初始化對象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
if (g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if (g_pD3D != NULL)
g_pD3D->Release();
KillTimer(NULL, 1);
}
//-----------------------------------------------------------------------------
// 名稱: Render()
// 描述: 繪製場景
//-----------------------------------------------------------------------------
VOID Render()
{
if (NULL == g_pd3dDevice)
return;
//清除背景緩存並重新設置爲藍色
g_pd3dDevice->Clear(0, // pRects中的矩形數,如果 pRects爲NULL着該參數必須爲0
NULL, //一個指向D3DRECT結構體的指針
D3DCLEAR_TARGET, //D3DCLEAR標誌,現在爲清空當前的渲染器
D3DCOLOR_XRGB(0, 0, 0), //顏色
1.0f, // depth buffer的新z值
0 //模板
);
// 開始渲染場景
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
// 可以在這裏渲染場景
// 結束渲染
g_pd3dDevice->EndScene();
}
// 清苦當前緩存中的數據
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//-----------------------------------------------------------------------------
// 名稱: MsgProc()
// 描述: Windows窗體句柄
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render();
ValidateRect(hWnd, NULL);//效驗矩形數據
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
void CALLBACK TimeProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{
if (NULL == g_pd3dDevice)
return;
//清除背景緩存並重新設置爲顏色
g_pd3dDevice->Clear(0, // pRects中的矩形數,如果 pRects爲NULL着該參數必須爲0
NULL, //一個指向D3DRECT結構體的指針
D3DCLEAR_TARGET, //D3DCLEAR標誌,現在爲清空當前的渲染器
D3DCOLOR_XRGB(0, dwTime%256, 0), //顏色
1.0f, // depth buffer的新z值
0 //模板
);
// 開始渲染場景
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
// 可以在這裏渲染場景
// 結束渲染
g_pd3dDevice->EndScene();
}
// 清苦當前緩存中的數據
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//WinMain函數入口
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
//直接初始化結構體
/*
GetModuleHandle 函數是返回一個模塊在當前進程地址空間的HMODULE
如果函數參數值爲NULL則返回一個虛擬當前句柄.
*/
WNDCLASSEX wc = { sizeof(WNDCLASSEX), //指定了以字節爲單位的結構的大小
CS_CLASSDC, //所有屬於該類的窗口實例共享相同的DC
MsgProc, //是指向窗口過程的指針
0L, //…………
0L, //…………
GetModuleHandle(NULL), //是指向窗口過程實例的句柄
NULL, //指向窗口圖標的句柄
NULL, //指向窗口光標的句柄
NULL, //背景刷
NULL, //菜單
"D3D Tutorial", //類名
NULL //指向小圖標的句柄
};
//註冊窗體類
RegisterClassEx(&wc);
//創建窗體
HWND hWnd = CreateWindow("D3D Tutorial", //窗體的類名
"D3D Tutorial 01: CreateDevice", //標題
WS_OVERLAPPEDWINDOW, //窗體風格
100, //位置座標x
100, //位置座標y
300, //寬
300, //高
NULL, //父窗口
NULL, //菜單
wc.hInstance, //窗體類句柄,2000以上的系統無含義!
NULL //窗體結構參數
);
SetTimer(NULL, 1, 1000, TimeProc);
// Initialize Direct3D
if (SUCCEEDED(InitD3D(hWnd)))
{
// Show the window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
// Enter the message loop
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnregisterClass("D3D Tutorial", wc.hInstance);
return 0;
}