|
|
#include<windows.h>
#include<d3d9.h>
#include<d3dx9.h>
IDirect3D9 * d3d=NULL;
IDirect3DDevice9 *pDevice3D=NULL;
IDirect3DVertexBuffer9* p_vb=NULL;
struct CUSTOMVERTEX{
FLOAT x,y,z;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ |D3DFVF_DIFFUSE)
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
HRESULT InitD3D(HWND);
HRESULT InitDraw( );
void render(void);
void cleanUp(void);
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
)
{
WNDCLASS winclass;
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
winclass.hCursor=LoadCursor(NULL,IDC_ARROW);
winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
winclass.hInstance=hInstance;
winclass.lpfnWndProc=WindowProc;
winclass.lpszClassName="winclass";
winclass.lpszMenuName=NULL;
winclass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&winclass);
HWND hwnd;
hwnd=CreateWindow("winclass","the window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
if(FAILED(InitD3D(hwnd)))
{
MessageBox(0,"initD3D failed",0,0);
return false;
}
if(FAILED(InitDraw()))
{
MessageBox(0,"initDraw failed",0,0);
return false;
}
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG message;
while(message.message!=WM_QUIT)
{
if( PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
else
{
render();
}
}
cleanUp();
return message.wParam;
}
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
void render(void)
{
if(NULL==pDevice3D)
{
return ;
}
pDevice3D->Clear(0,NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
if(SUCCEEDED(pDevice3D->BeginScene()))//开始绘制
{
//RENDER CODE
pDevice3D->SetStreamSource(0,p_vb,0,sizeof(CUSTOMVERTEX));//参数不明白
pDevice3D->SetFVF(D3DFVF_CUSTOMVERTEX);//THE SAME
pDevice3D->DrawPrimitive(D3DPT_TRIANGLELIST ,0,1);
pDevice3D->EndScene();
}
pDevice3D-> resent(NULL,NULL,NULL,NULL);//显示到屏幕
}
void cleanUp(void)
{
if(p_vb!=NULL)
p_vb->Release();
if(pDevice3D!=NULL)
pDevice3D->Release();
if( d3d!=NULL)
d3d->Release();
}
HRESULT InitD3D(HWND hwnd)
{
d3d=Direct3DCreate9(D3D_SDK_VERSION);
if(NULL== d3d)
{
return false;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.BackBufferHeight=600;
d3dpp.BackBufferWidth=800;
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.AutoDepthStencilFormat=D3DFMT_D24S8;//?
d3dpp.Flags=0;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if(FAILED( d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&pDevice3D
)))
{
MessageBox(hwnd,"eorr2","messagebox",MB_OK);
return E_FAIL;
}
return S_OK;
}
HRESULT InitDraw( )
{
CUSTOMVERTEX Vertices[3]=
{
{-1.0f, -1.0f, 0.0f,D3DCOLOR_XRGB(255,0,0)},
{1.0f, -1.0f, 0.0f,D3DCOLOR_XRGB(0,255,0)},
{0.0f, 1.0f, 0.0f,D3DCOLOR_XRGB(0,255,255)}
};
//建立顶点缓冲区
if(FAILED(pDevice3D->CreateVertexBuffer(3*sizeof( CUSTOMVERTEX),
0,D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,&p_vb,NULL)))
{
return E_FAIL;
}
//锁定定点缓冲区
VOID* pVertices;
if(FAILED(p_vb->Lock(0,sizeof(Vertices),(void**)&pVertices,0)))//?
{
return E_FAIL;
}
//将顶点资料填入顶点缓冲区里
memcpy(pVertices,Vertices,sizeof(Vertices));//?the last parameter
p_vb->Unlock();
return S_OK;
}
谢谢了 |
|