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;
}

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