/* * Author: Leng_que * Date: 2009/08/29 * E-mail: leng_que@yahoo.com.cn * Description: Draw a triangle by DirectX 9.0 */ #include <windows.h> #pragma comment(linker, "/subsystem:windows") #include <d3d9.h> #pragma comment(lib,"d3d9.lib") HRESULT InitVB(); HRESULT InitD3D( HWND hWnd ); LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color; }; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { WNDCLASS wndclass; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndclass.hInstance = hInstance; wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = "leng_que"; wndclass.lpszMenuName = NULL; wndclass.style = CS_HREDRAW | CS_VREDRAW; RegisterClass( &wndclass ); HWND hwnd = CreateWindow ( wndclass.lpszClassName, "DirectX", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow(hwnd,nShowCmd); UpdateWindow(hwnd); MSG msg; while ( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage(&msg); DispatchMessage(&msg); } UnregisterClass( wndclass.lpszClassName, wndclass.hInstance ); return 0; } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_CREATE: InitD3D(hwnd); InitVB(); break; case WM_PAINT: g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); 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->Present( NULL, NULL, NULL, NULL ); break; case WM_SIZE: break; case WM_LBUTTONDOWN: break; case WM_RBUTTONDOWN: break; case WM_DESTROY: if (g_pVB != NULL) g_pVB->Release(); if (g_pd3dDevice != NULL) g_pd3dDevice->Release(); if (g_pD3D != NULL) g_pD3D->Release(); PostQuitMessage(0); break; } return DefWindowProc(hwnd,message,wParam,lParam); } HRESULT InitVB() { CUSTOMVERTEX Vertices[] = { { 250.0f, 100.0f, 0.5f, 1.0f, RGB(255,0,0) }, { 350.0f, 250.0f, 0.5f, 1.0f, RGB(0,255,0) }, { 150.0f, 250.0f, 0.5f, 1.0f, RGB(0,0,255) }, }; g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL); VOID* pVertices; g_pVB->Lock(0, sizeof(Vertices), (void**)&pVertices, 0); memcpy( pVertices, Vertices, sizeof(Vertices) ); g_pVB->Unlock(); return 0; } HRESULT InitD3D( HWND hWnd ) { g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice); return 0; }