画两条线
#pragma once#pragma comment(lib,"d3d9.lib")#pragma comment(lib,"d3dx9.lib")#include#include //TODO: -1 custom vertexstruct CUSTOMVERTEX{ float x; float y; float z; float rhw;};#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHWHRESULT InitD3D(HWND hWnd);void CleanUp();void Render();LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);HRESULT InitD3DVertexBuffer();//TODO: 0 declare d3d variables.LPDIRECT3D9 g_pd3d = NULL;LPDIRECT3DDEVICE9 g_pd3dDevice9 = NULL;LPDIRECT3DVERTEXBUFFER9 g_pd3dVB = NULL;//application entry point.INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, INT){ //initialize wnd class. WNDCLASSEX wcex; ZeroMemory(&wcex,sizeof(wcex)); wcex.cbSize=sizeof(wcex); wcex.hInstance=GetModuleHandle(NULL); wcex.lpfnWndProc=MsgProc; wcex.lpszClassName=L"Self001"; wcex.style=CS_CLASSDC; //register wnd class. RegisterClassEx(&wcex); //create window. HWND hWnd=CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, L"Self001", L"Self001 Window", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, wcex.hInstance, NULL); //init d3d if(SUCCEEDED(InitD3D(hWnd))) { //show window. ShowWindow(hWnd,SW_SHOWDEFAULT); UpdateWindow(hWnd); //message loop. MSG msg; ZeroMemory(&msg,sizeof(msg)); while(msg.message != WM_QUIT) { if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { Render(); } } } //unregister wnd class. UnregisterClass(L"Self001",wcex.hInstance); return 0;}//init d3d.HRESULT InitD3D(HWND hWnd){ //create d3d. g_pd3d=Direct3DCreate9(D3D_SDK_VERSION); if(g_pd3d == NULL) { return E_FAIL; } //initialize d3d present parameters. D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed=TRUE; d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat=D3DFMT_UNKNOWN; //create d3d device. if(FAILED(g_pd3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice9))) { return E_FAIL; } //init vertex buffer. if(FAILED(InitD3DVertexBuffer())) { return E_FAIL; } return S_OK;}//clean up d3d.void CleanUp(){ //TODO: 3 clean up d3d. if(g_pd3dVB != NULL) { g_pd3dVB->Release(); } //release device. if(g_pd3dDevice9 != NULL) { g_pd3dDevice9->Release(); } //release d3d. if(g_pd3d != NULL) { g_pd3d->Release(); }}//render the scene.void Render(){ //clear target. g_pd3dDevice9->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); //draw primitive. if(SUCCEEDED(g_pd3dDevice9->BeginScene())) { //TODO: 2 render d3d. g_pd3dDevice9->SetStreamSource(0,g_pd3dVB,0,sizeof(CUSTOMVERTEX)); g_pd3dDevice9->SetFVF(D3DFVF_CUSTOMVERTEX); g_pd3dDevice9->DrawPrimitive(D3DPT_LINELIST,0,2); g_pd3dDevice9->EndScene(); } //present sence. g_pd3dDevice9->Present(NULL,NULL,NULL,NULL);}//window message handler.LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ switch(msg) { case WM_DESTROY: CleanUp(); return 0L; } return DefWindowProc(hWnd,msg,wParam,lParam);}//init d3d vertex buffer.HRESULT InitD3DVertexBuffer(){ //TODO: 1 init vertex buffer data. //create vertex data. CUSTOMVERTEX vertices[4]= { {50.0f,50.0f,1.0f,1.0f}, {50.0f,250.0f,1.0f,1.0f}, {250.0f,50.0f,1.0f,1.0f}, {250.0f,250.0f,1.0f,1.0f} }; //create vertex buffer. if(FAILED(g_pd3dDevice9->CreateVertexBuffer( sizeof(vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pd3dVB, NULL))) { return E_FAIL; } //fill vertex buffer. void* pVertices=NULL; if(FAILED(g_pd3dVB->Lock(0,sizeof(vertices),&pVertices,0))) { return E_FAIL; } memcpy(pVertices,vertices,sizeof(vertices)); g_pd3dVB->Unlock(); return S_OK;}
程序结果
选择图元小心别误选。