|
源代码如下:
#include "d3d9.h"
#include "windows.h"
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
struct CUSTOMVERTEX
{
FLOAT x,y,z, rhw;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) //定点格式
HRESULT InitVB()
{
CUSTOMVERTEX vertices[] =
{ {100.f, 400.f, 0.5f, 1.0f, 0xffff0000},
{300.f, 50.f, 0.5f, 1.0f, 0xff00ff00},
{500.f, 400.f, 0.5f, 1.0f, 0xff0000ff},
};
if(FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB, NULL)))
{
return E_FAIL;
}
//填充顶点缓冲
VOID *pVertices;
if(FAILED(g_pVB->Lock(0, sizeof(vertices), (void**)&pVertices, 0)))
return E_FAIL;
memcpy(pVertices, vertices, sizeof(vertices));
g_pVB->Unlock();
return S_OK;
}
HRESULT InitD3D(HWND hWnd)
{
if(NULL == (g_pD3D= Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
{
return E_FAIL;
}
return S_OK;
}
VOID Cleanup()
{
if(g_pVB!=NULL)
g_pVB->Release();
if(g_pd3dDevice!=NULL)
g_pd3dDevice->Release();
if(g_pD3D!=NULL)
g_pD3D->Release();
}
VOID Render()
{
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45,50,170), 1.0f, 0);
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
g_pd3dDevice->EndScene();
}
g_pd3dDevice-> resent(NULL,NULL,NULL,NULL);
}
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();
//ValidataRect(hWnd,NULL);
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
//INT WINPAI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
L"ClassName", NULL };
RegisterClassEx( &wc );
HWND hWnd=CreateWindow(L"ClassName", L"最简单的", WS_OVERLAPPEDWINDOW,
200,200,800,600,NULL, NULL, wc.hInstance, NULL);
if(SUCCEEDED(InitD3D(hWnd)))
{
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
UnregisterClass(L"ClassName",wc.hInstance);
return 0;
} |
|