Direct3D9基本框架

来源:互联网 发布:申请淘宝客服介入处理 编辑:程序博客网 时间:2024/04/29 09:25

 

  1#include<d3dx9.h>
  2#include<d3d9.h>
  3
  4
  5
  6#pragma comment(lib,"d3dx9.lib")
  7#pragma comment(lib,"d3d9.lib")
  8 
  9
 10#define MAX_LOADSTRING 100
 11
 12
 13HINSTANCE hInst;        
 14TCHAR szTitle[MAX_LOADSTRING]=TEXT("D3D");
 15TCHAR szWindowClass[MAX_LOADSTRING]=TEXT("HelloD3D");  
 16
 17
 18
 19ATOM    MyRegisterClass(HINSTANCE hInstance);
 20BOOL    InitInstance(HINSTANCE, int);
 21LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 22
 23
 24
 25HWND g_hWnd=NULL;
 26
 27IDirect3D9 *pD3D=NULL;
 28IDirect3DDevice9 *pDevice=NULL;
 29
 30
 31bool InitD3D();
 32void Release();
 33void Render();
 34
 35
 36
 37int APIENTRY WinMain(HINSTANCE hInstance,
 38                     HINSTANCE hPrevInstance,
 39                     LPSTR     lpCmdLine,
 40                     int       nCmdShow)
 41{
 42  MSG msg;
 43
 44  MyRegisterClass(hInstance);
 45
 46  if (!InitInstance (hInstance, nCmdShow))
 47  {
 48  return FALSE;
 49  }

 50
 51  if(!InitD3D())
 52  {
 53   return -1;
 54  }

 55
 56  ZeroMemory(&msg,sizeof(msg));
 57
 58  while (msg.message!=WM_QUIT)
 59  {
 60    if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
 61    {
 62     TranslateMessage(&msg);
 63     DispatchMessage(&msg);
 64 
 65    }

 66    else
 67    {
 68   Render();
 69    }

 70  }

 71
 72  return (int)msg.wParam;
 73}

 74
 75
 76ATOM MyRegisterClass(HINSTANCE hInstance)
 77{
 78 WNDCLASSEX wcex;
 79
 80 wcex.cbSize = sizeof(WNDCLASSEX);
 81
 82 wcex.style   = CS_HREDRAW | CS_VREDRAW;
 83 wcex.lpfnWndProc = (WNDPROC)WndProc;
 84 wcex.cbClsExtra  = 0;
 85 wcex.cbWndExtra  = 0;
 86 wcex.hInstance  = hInstance;
 87 wcex.hIcon   = NULL;
 88 wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);
 89 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 90 wcex.lpszMenuName = NULL;
 91 wcex.lpszClassName = szWindowClass;
 92 wcex.hIconSm  = NULL;
 93 return RegisterClassEx(&wcex);
 94}

 95
 96
 97BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
 98{
 99   HWND hWnd;
100
101   hInst = hInstance;
102
103   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
104      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
105
106   if (!hWnd)
107   {
108      return FALSE;
109   }

110
111   g_hWnd=hWnd;
112
113   ShowWindow(hWnd, nCmdShow);
114   UpdateWindow(hWnd);
115
116   return TRUE;
117}

118
119
120LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
121{
122 switch (message)
123 {
124  case WM_DESTROY:
125   Release();
126   PostQuitMessage(0);
127   break;
128  default:
129   return DefWindowProc(hWnd, message, wParam, lParam);
130   }

131   return 0;
132}

133
134
135void Release()
136{
137 if(pDevice!=NULL)
138  pDevice->Release();
139 if(pD3D!=NULL)
140  pD3D->Release();
141}

142
143
144bool InitD3D()
145{
146  pD3D=Direct3DCreate9(D3D_SDK_VERSION);
147
148  if(pD3D==NULL)
149  {
150   MessageBox(NULL,TEXT("pD3D init failed"),TEXT("error"),MB_OK);
151   return false;
152  }

153
154  D3DPRESENT_PARAMETERS d3dpp;
155
156  ZeroMemory( &d3dpp, sizeof(d3dpp) );
157  d3dpp.Windowed   = TRUE;
158  d3dpp.SwapEffect = D3DSWAPEFFECT_COPY;
159
160
161
162  HRESULT hr;
163  hr=pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
164     g_hWnd,
165     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
166     &d3dpp,
167     &pDevice);
168
169  if(FAILED(hr))
170  {
171   MessageBox(NULL,TEXT("create device failed"),TEXT("error"),MB_OK);
172   return false;
173  }

174
175  return true;
176}

177
178
179
180void Render()
181{
182 if(pDevice==NULL)
183 {
184 return ;
185 }

186
187 pDevice->Clear(1,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
188
189 pDevice->Present(NULL,NULL,NULL,NULL);
190
191}

192
193