#include <d3d9.h>
#define SAFE_RELEASE(p) {if(p) {(p)->Release(); (p)=NULL;}}
wchar_t *g_pclassname =L"file";//窗口类名
wchar_t *g_windowname =L"填充,按下QWE";//标题名
LPDIRECT3DDEVICE9 g_pd3ddevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pvertexbuf=NULL;
struct CUSTOMVERTEX
{
FLOAT _x,_y,_z,_rhw;
DWORD _color;
CUSTOMVERTEX (FLOAT x, FLOAT y,FLOAT z,FLOAT rhw,DWORD color):_x(x),_y(y),_z(z),_rhw(rhw),_color(color){}
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
HRESULT initdirect3d(HWND hwnd); //direct初始化
VOID direct3drender(); //渲染
VOID direct3dclenup(); //清理资源
LRESULT CALLBACK wndporc(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 =wndporc;
wndclass.lpszClassName =g_pclassname;
wndclass.lpszMenuName =NULL;
wndclass.style =CS_VREDRAW|CS_HREDRAW;
//注册窗口
if(!RegisterClass(&wndclass))
return 0;
//创建窗口
HWND hwnd=CreateWindow(g_pclassname,g_windowname,WS_OVERLAPPEDWINDOW,100,100,400,600,NULL,NULL,hInstance,NULL);
initdirect3d(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_pclassname ,hInstance);
return 0;
}
LRESULT CALLBACK wndporc(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)
DestroyWindow(hwnd);
break;
case WM_DESTROY:
direct3dclenup();
DestroyWindow(0);
break;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
HRESULT initdirect3d(HWND hwnd)
{
LPDIRECT3D9 pd3d =NULL;
pd3d =Direct3DCreate9(D3D_SDK_VERSION);
if(pd3d==NULL) return S_FALSE;
D3DCAPS9 caps;int vp =0;
pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp =D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferHeight =640;
d3dpp.BackBufferWidth =680;
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,vp,&d3dpp,&g_pd3ddevice);
pd3d->Release();
//创建缓存
g_pd3ddevice->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pvertexbuf,NULL);
//填充顶点数据
CUSTOMVERTEX *pvertices =NULL;
g_pvertexbuf->Lock(0,0,(void**)&pvertices,0);
pvertices[0] =CUSTOMVERTEX(220.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0));
pvertices[1] =CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
pvertices[2] =CUSTOMVERTEX(220.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
pvertices[3] =CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
pvertices[4] =CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255));
pvertices[5] =CUSTOMVERTEX(220.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
g_pvertexbuf->Unlock();
return S_OK;
}
VOID direct3drender()
{
g_pd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
g_pd3ddevice->BeginScene();//开始绘制
if(::GetAsyncKeyState('Q')&0x8000)
g_pd3ddevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_POINT);
if(::GetAsyncKeyState('W')&0x8000)
g_pd3ddevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
if(::GetAsyncKeyState('E')&0x8000)
g_pd3ddevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
//渲染正方形
g_pd3ddevice->SetStreamSource(0,g_pvertexbuf,0,sizeof(CUSTOMVERTEX));
g_pd3ddevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
g_pd3ddevice->EndScene();
g_pd3ddevice->Present(NULL,NULL,NULL,NULL);
}
VOID direct3dclenup()
{
SAFE_RELEASE(g_pvertexbuf);
SAFE_RELEASE(g_pd3ddevice);
}
#define SAFE_RELEASE(p) {if(p) {(p)->Release(); (p)=NULL;}}
wchar_t *g_pclassname =L"file";//窗口类名
wchar_t *g_windowname =L"填充,按下QWE";//标题名
LPDIRECT3DDEVICE9 g_pd3ddevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pvertexbuf=NULL;
struct CUSTOMVERTEX
{
FLOAT _x,_y,_z,_rhw;
DWORD _color;
CUSTOMVERTEX (FLOAT x, FLOAT y,FLOAT z,FLOAT rhw,DWORD color):_x(x),_y(y),_z(z),_rhw(rhw),_color(color){}
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
HRESULT initdirect3d(HWND hwnd); //direct初始化
VOID direct3drender(); //渲染
VOID direct3dclenup(); //清理资源
LRESULT CALLBACK wndporc(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 =wndporc;
wndclass.lpszClassName =g_pclassname;
wndclass.lpszMenuName =NULL;
wndclass.style =CS_VREDRAW|CS_HREDRAW;
//注册窗口
if(!RegisterClass(&wndclass))
return 0;
//创建窗口
HWND hwnd=CreateWindow(g_pclassname,g_windowname,WS_OVERLAPPEDWINDOW,100,100,400,600,NULL,NULL,hInstance,NULL);
initdirect3d(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_pclassname ,hInstance);
return 0;
}
LRESULT CALLBACK wndporc(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)
DestroyWindow(hwnd);
break;
case WM_DESTROY:
direct3dclenup();
DestroyWindow(0);
break;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
HRESULT initdirect3d(HWND hwnd)
{
LPDIRECT3D9 pd3d =NULL;
pd3d =Direct3DCreate9(D3D_SDK_VERSION);
if(pd3d==NULL) return S_FALSE;
D3DCAPS9 caps;int vp =0;
pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp =D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferHeight =640;
d3dpp.BackBufferWidth =680;
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,vp,&d3dpp,&g_pd3ddevice);
pd3d->Release();
//创建缓存
g_pd3ddevice->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pvertexbuf,NULL);
//填充顶点数据
CUSTOMVERTEX *pvertices =NULL;
g_pvertexbuf->Lock(0,0,(void**)&pvertices,0);
pvertices[0] =CUSTOMVERTEX(220.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0));
pvertices[1] =CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
pvertices[2] =CUSTOMVERTEX(220.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
pvertices[3] =CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
pvertices[4] =CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255));
pvertices[5] =CUSTOMVERTEX(220.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
g_pvertexbuf->Unlock();
return S_OK;
}
VOID direct3drender()
{
g_pd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
g_pd3ddevice->BeginScene();//开始绘制
if(::GetAsyncKeyState('Q')&0x8000)
g_pd3ddevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_POINT);
if(::GetAsyncKeyState('W')&0x8000)
g_pd3ddevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
if(::GetAsyncKeyState('E')&0x8000)
g_pd3ddevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
//渲染正方形
g_pd3ddevice->SetStreamSource(0,g_pvertexbuf,0,sizeof(CUSTOMVERTEX));
g_pd3ddevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
g_pd3ddevice->EndScene();
g_pd3ddevice->Present(NULL,NULL,NULL,NULL);
}
VOID direct3dclenup()
{
SAFE_RELEASE(g_pvertexbuf);
SAFE_RELEASE(g_pd3ddevice);
}