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
 13 HINSTANCE hInst;        
 14 TCHAR szTitle[MAX_LOADSTRING] = TEXT( " D3D " );
 15 TCHAR szWindowClass[MAX_LOADSTRING] = TEXT( " HelloD3D " );  
 16
 17
 18
 19 ATOM    MyRegisterClass(HINSTANCE hInstance);
 20 BOOL    InitInstance(HINSTANCE,  int );
 21 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 22
 23
 24
 25 HWND g_hWnd = NULL;
 26
 27 IDirect3D9  * pD3D = NULL;
 28 IDirect3DDevice9  * pDevice = NULL;
 29
 30
 31 bool  InitD3D();
 32 void  Release();
 33 void  Render();
 34
 35
 36
 37 int  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
 76 ATOM 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
 97 BOOL 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
120 LRESULT 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
135 void  Release()
136 {
137   if (pDevice != NULL)
138   pDevice -> Release();
139   if (pD3D != NULL)
140   pD3D -> Release();
141 }

142
143
144 bool  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
180 void  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