direct3d9 漸變的窗口代碼



//包含Dx9的頭文件
#include <d3d9.h>
#pragma warning( disable : 4996 ) //除去警告
#include <strsafe.h>
#pragma warning( default : 4996 )

//-----------------------------------------------------------------------------
// 全局參數
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D = NULL; // 創建 D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // 我們使用的渲染設備

//-----------------------------------------------------------------------------
// 名稱: InitD3D()
// 描述: 初始化 Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D(HWND hWnd)
{
 // 根據版本創建D3D對象
 if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
  return E_FAIL;

 //設置參數
 D3DPRESENT_PARAMETERS d3dpp;                //參數對象,用於下面的設備創建
 ZeroMemory(&d3dpp, sizeof(d3dpp));        //用0來填充d3dpp內存區域,也就是初始化內存
 d3dpp.Windowed = TRUE;                        //設置爲窗口模式
 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    //交換緩衝支持的效果類型,指定表面在交換鏈中是如何被交換的。這裏爲後備的緩存加載之後就刪除。
 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    //顯示模式

 //創建設備驅動Direct3D
 if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,                        //默認適配器
  D3DDEVTYPE_HAL,                            //硬件驅動
  hWnd,                                        //設備所使用的窗體
  D3DCREATE_SOFTWARE_VERTEXPROCESSING,        //頂點像素渲染方式
  &d3dpp,                                    //參數
  &g_pd3dDevice                                //驅動設備
  )))
 {
  return E_FAIL;
 }

 // 初始化完成

 return S_OK;
}

//-----------------------------------------------------------------------------
// 名稱: Cleanup()
// 描述: 釋放所有初始化對象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
 if (g_pd3dDevice != NULL)
  g_pd3dDevice->Release();

 if (g_pD3D != NULL)
  g_pD3D->Release();
 KillTimer(NULL, 1);
}



//-----------------------------------------------------------------------------
// 名稱: Render()
// 描述: 繪製場景
//-----------------------------------------------------------------------------
VOID Render()
{
 if (NULL == g_pd3dDevice)
  return;

 //清除背景緩存並重新設置爲藍色
 g_pd3dDevice->Clear(0,                             // pRects中的矩形數,如果 pRects爲NULL着該參數必須爲0
  NULL,                         //一個指向D3DRECT結構體的指針
  D3DCLEAR_TARGET,             //D3DCLEAR標誌,現在爲清空當前的渲染器
  D3DCOLOR_XRGB(0, 0, 0),     //顏色   
  1.0f,                         // depth buffer的新z值
  0                             //模板
  );

 // 開始渲染場景
 if (SUCCEEDED(g_pd3dDevice->BeginScene()))
 {
  // 可以在這裏渲染場景

  // 結束渲染
  g_pd3dDevice->EndScene();
 }

 // 清苦當前緩存中的數據
 g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

//-----------------------------------------------------------------------------
// 名稱: MsgProc()
// 描述: Windows窗體句柄
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg)
 {
 case WM_DESTROY:
  Cleanup();
  PostQuitMessage(0);
  return 0;

 case WM_PAINT:
  Render();
  ValidateRect(hWnd, NULL);//效驗矩形數據
  return 0;
 }

 return DefWindowProc(hWnd, msg, wParam, lParam);
}
void CALLBACK TimeProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{
 if (NULL == g_pd3dDevice)
  return;

 //清除背景緩存並重新設置爲顏色
 g_pd3dDevice->Clear(0,                             // pRects中的矩形數,如果 pRects爲NULL着該參數必須爲0
  NULL,                         //一個指向D3DRECT結構體的指針
  D3DCLEAR_TARGET,             //D3DCLEAR標誌,現在爲清空當前的渲染器
  D3DCOLOR_XRGB(0, dwTime%256, 0),     //顏色   
  1.0f,                         // depth buffer的新z值
  0                             //模板
  );

 // 開始渲染場景
 if (SUCCEEDED(g_pd3dDevice->BeginScene()))
 {
  // 可以在這裏渲染場景

  // 結束渲染
  g_pd3dDevice->EndScene();
 }

 // 清苦當前緩存中的數據
 g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//WinMain函數入口

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{

 //直接初始化結構體
 /*
 GetModuleHandle 函數是返回一個模塊在當前進程地址空間的HMODULE
 如果函數參數值爲NULL則返回一個虛擬當前句柄.
 */
 WNDCLASSEX wc = { sizeof(WNDCLASSEX),            //指定了以字節爲單位的結構的大小
  CS_CLASSDC,                    //所有屬於該類的窗口實例共享相同的DC
  MsgProc,                        //是指向窗口過程的指針
  0L,                            //…………
  0L,                            //…………
  GetModuleHandle(NULL),        //是指向窗口過程實例的句柄
  NULL,                            //指向窗口圖標的句柄
  NULL,                            //指向窗口光標的句柄
  NULL,                            //背景刷
  NULL,                            //菜單
  "D3D Tutorial",                //類名
  NULL                            //指向小圖標的句柄
 };
 //註冊窗體類
 RegisterClassEx(&wc);

 //創建窗體
 HWND hWnd = CreateWindow("D3D Tutorial",                                //窗體的類名
  "D3D Tutorial 01: CreateDevice",                //標題
  WS_OVERLAPPEDWINDOW,                            //窗體風格
  100,                                            //位置座標x
  100,                                            //位置座標y
  300,                                            //寬
  300,                                            //高
  NULL,                                            //父窗口
  NULL,                                            //菜單
  wc.hInstance,                                    //窗體類句柄,2000以上的系統無含義!
  NULL                                            //窗體結構參數
  );
 SetTimer(NULL, 1, 1000, TimeProc);
 // Initialize Direct3D
 if (SUCCEEDED(InitD3D(hWnd)))
 {
  // Show the window
  ShowWindow(hWnd, SW_SHOWDEFAULT);
  UpdateWindow(hWnd);

  // Enter the message loop
  MSG msg;
  while (GetMessage(&msg, NULL, 0, 0))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }

 UnregisterClass("D3D Tutorial", wc.hInstance);
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章