#include <d3d9.h>
#define SAFE_RELESE(p) {if(p){(p)->Release(); (p)=NULL;}}
wchar_t *g_classname =L"hellowdirect3D";
wchar_t *g_windowname =L"direct3D";
LPDIRECT3DDEVICE9 g_pd3ddevice =NULL;//设备接口
HRESULT initdirect(HWND hwnd);//初始化direct
VOID direct3Drender();//渲染图形
VOID direct3Dcleanup();//清理资源
LRESULT CALLBACK wndproc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
WNDCLASS wndclass;//创建窗口类
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(BLACK_BRUSH);//背景颜色
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);//光标
wndclass.hIcon =LoadCursor(NULL,IDI_APPLICATION);//小图标
wndclass.hInstance =hInstance;
wndclass.lpfnWndProc =wndproc;
wndclass.lpszClassName =g_classname;
wndclass.lpszMenuName =NULL;
wndclass.style =CS_HREDRAW|CS_VREDRAW;
//注册窗口
if(!RegisterClass(&wndclass))
return 0;
//创建窗口
HWND hwnd=CreateWindow(g_classname,g_windowname,WS_OVERLAPPEDWINDOW,200,200,400,600,NULL,NULL,hInstance,NULL);
//初始化direct
initdirect(hwnd);
//显示和更新窗口
ShowWindow(hwnd,SW_SHOWDEFAULT);
UpdateWindow(hwnd);
//消息循环
MSG msg;
ZeroMemory (&msg,sizeof(&msg));
while (msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
direct3Drender();//图形渲染
}
UnregisterClass(g_classname,wndclass.hInstance);
}
return 0;
}
LRESULT CALLBACK wndproc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
switch(message)
{
case WM_PAINT: //重绘消息
direct3Drender();//渲染
ValidateRect(hwnd,NULL);//更新客户区
break;
case WM_KEYDOWN:
if(wparam==VK_ESCAPE) //按下esc键
DestroyWindow(hwnd);
break;
case WM_DESTROY:
direct3Dcleanup();//清理direct
PostQuitMessage(0);//退出程序
break;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
//初始化direct
HRESULT initdirect(HWND hwnd)
{
LPDIRECT3D9 pd3d=NULL;
pd3d =Direct3DCreate9(D3D_SDK_VERSION);
if(pd3d==NULL) return S_FALSE;
//获取硬件设备
D3DCAPS9 caps; int v=0;
pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
v=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
v=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
创建direct设备接口
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = 640;
d3dpp.BackBufferHeight = 480;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
pd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,v,&d3dpp,&g_pd3ddevice);
pd3d->Release();
return S_OK;
}
//渲染图形
VOID direct3Drender()
{
g_pd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(80,90,120),1.0f,0);
//开始绘制
g_pd3ddevice->BeginScene();
//先不绘制图形
g_pd3ddevice->EndScene();//结束绘制
g_pd3ddevice->Present(NULL,NULL,NULL,NULL);//翻转
}
//清理资源
VOID direct3Dcleanup()
{
if(g_pd3ddevice!=NULL)
g_pd3ddevice->Release();
g_pd3ddevice=NULL;
SAFE_RELESE(g_pd3ddevice);
#define SAFE_RELESE(p) {if(p){(p)->Release(); (p)=NULL;}}
wchar_t *g_classname =L"hellowdirect3D";
wchar_t *g_windowname =L"direct3D";
LPDIRECT3DDEVICE9 g_pd3ddevice =NULL;//设备接口
HRESULT initdirect(HWND hwnd);//初始化direct
VOID direct3Drender();//渲染图形
VOID direct3Dcleanup();//清理资源
LRESULT CALLBACK wndproc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
WNDCLASS wndclass;//创建窗口类
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(BLACK_BRUSH);//背景颜色
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);//光标
wndclass.hIcon =LoadCursor(NULL,IDI_APPLICATION);//小图标
wndclass.hInstance =hInstance;
wndclass.lpfnWndProc =wndproc;
wndclass.lpszClassName =g_classname;
wndclass.lpszMenuName =NULL;
wndclass.style =CS_HREDRAW|CS_VREDRAW;
//注册窗口
if(!RegisterClass(&wndclass))
return 0;
//创建窗口
HWND hwnd=CreateWindow(g_classname,g_windowname,WS_OVERLAPPEDWINDOW,200,200,400,600,NULL,NULL,hInstance,NULL);
//初始化direct
initdirect(hwnd);
//显示和更新窗口
ShowWindow(hwnd,SW_SHOWDEFAULT);
UpdateWindow(hwnd);
//消息循环
MSG msg;
ZeroMemory (&msg,sizeof(&msg));
while (msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
direct3Drender();//图形渲染
}
UnregisterClass(g_classname,wndclass.hInstance);
}
return 0;
}
LRESULT CALLBACK wndproc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
switch(message)
{
case WM_PAINT: //重绘消息
direct3Drender();//渲染
ValidateRect(hwnd,NULL);//更新客户区
break;
case WM_KEYDOWN:
if(wparam==VK_ESCAPE) //按下esc键
DestroyWindow(hwnd);
break;
case WM_DESTROY:
direct3Dcleanup();//清理direct
PostQuitMessage(0);//退出程序
break;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
//初始化direct
HRESULT initdirect(HWND hwnd)
{
LPDIRECT3D9 pd3d=NULL;
pd3d =Direct3DCreate9(D3D_SDK_VERSION);
if(pd3d==NULL) return S_FALSE;
//获取硬件设备
D3DCAPS9 caps; int v=0;
pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
v=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
v=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
创建direct设备接口
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = 640;
d3dpp.BackBufferHeight = 480;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
pd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,v,&d3dpp,&g_pd3ddevice);
pd3d->Release();
return S_OK;
}
//渲染图形
VOID direct3Drender()
{
g_pd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(80,90,120),1.0f,0);
//开始绘制
g_pd3ddevice->BeginScene();
//先不绘制图形
g_pd3ddevice->EndScene();//结束绘制
g_pd3ddevice->Present(NULL,NULL,NULL,NULL);//翻转
}
//清理资源
VOID direct3Dcleanup()
{
if(g_pd3ddevice!=NULL)
g_pd3ddevice->Release();
g_pd3ddevice=NULL;
SAFE_RELESE(g_pd3ddevice);
}