您的位置:首页 > 编程语言

direct3d9 渐变的窗口代码

2015-11-19 15:33 260 查看

//包含Dx9的头文件

#include <d3d9.h>

#pragma warning( disable : 4996
dad0
) //除去警告

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: