织梦CMS - 轻松建站从此开始!

罗索

D3DWindow类:快速创建Win32窗口以及D3D设备

jackyhwei 发布于 2010-08-17 21:58 点击:次 
落鹤生:这是一个D3DWindow封装类,用于快速创建Win32窗口以及D3D设备,及Direct3D的初始化及资源释放。
TAG:

头文件

  1. // 文件: D3DWindow.h 
  2. // 描述: D3DWindow类的头文件,定义变量,函数。 
  3.  
  4. #pragma once 
  5. #define _WIN32_WINNT 0x0502 
  6. #include <d3dx9.h> 
  7. #include <winuser.h> 
  8. #pragma comment (lib, "d3d9.lib") 
  9. #pragma comment (lib, "d3dx9.lib") 
  10. #pragma comment (lib, "User32.lib") 
  11. #include "D3DCamera.h" 
  12. struct D3DWINDOW 
  13.     HINSTANCE hInst;// 实例句柄 
  14.     WNDPROC pMsgProc;// 消息处理函数指针 
  15.     INT iWidth;// 屏幕宽度 
  16.     INT iHeight;// 屏幕高度 
  17.     LPCTSTR lpszClassName;// 窗口类名 
  18.     LPCTSTR lpszWindowName;// 窗口名 
  19.     HICON hIcon; // 图标句柄 
  20.     HCURSOR hCursor;// 光标句柄 
  21.     HWND hWnd; // 窗口句柄 
  22.     LPDIRECT3D9 pD3D;// D3D对象,用于创建设备 
  23.     LPDIRECT3DDEVICE9 pd3dDevice;// D3D设备,用于渲染 
  24.     D3DDISPLAYMODE* pd3ddm;// 硬件显示模式 
  25. }; 
  26. #define WND_WIDTH   640 // 默认显示宽度 
  27. #define WND_HEIGHT  480 // 默认显示高度 
  28. #define VIEW_2D     0 // 2D视图(正交投影) 
  29. #define VIEW_3D     1 // 3D视图(透视投影) 
  30. class D3DWindow 
  31. public
  32.     D3DWindow(D3DWINDOW* _pd3dWindow); 
  33. public
  34.     ~D3DWindow(void); 
  35. public
  36.     VOID showWindow(); 
  37.     D3DWINDOW getWindow(); 
  38.     VOID cleanup(); 
  39.     VOID startRender(); 
  40.     VOID endRender(); 
  41. private
  42.     VOID initD3D(); 
  43. private
  44.     D3DWINDOW m_d3dWindow; 
  45. }; 

源代码:

  1. // 文件: D3DWindow.cpp 
  2. // 描述: 用于快速创建Win32窗口以及D3D设备 
  3.  
  4. #include "D3DWindow.h" 
  5.  
  6. // 名称: D3DWindow() 
  7. // 描述: 自定义构造函数 
  8.  
  9. D3DWindow::D3DWindow(D3DWINDOW* _pd3dWindow) 
  10.     m_d3dWindow = *_pd3dWindow; 
  11.     if (m_d3dWindow.iWidth == 0 || m_d3dWindow.iHeight == 0) 
  12.     { 
  13.         m_d3dWindow.iWidth = WND_WIDTH; 
  14.         m_d3dWindow.iHeight = WND_HEIGHT; 
  15.     } 
  16.     if (m_d3dWindow.lpszClassName == 0) 
  17.     { 
  18.         m_d3dWindow.lpszClassName = TEXT("D3D_2D Window"); 
  19.     } 
  20.     if (m_d3dWindow.lpszWindowName == 0) 
  21.     { 
  22.         m_d3dWindow.lpszWindowName = TEXT("D3D_2D Window"); 
  23.     } 
  24.     if (m_d3dWindow.pd3ddm == 0) 
  25.     { 
  26.         m_d3dWindow.pd3ddm = new D3DDISPLAYMODE(); 
  27.     } 
  28.     // 注册窗口类 
  29.     WNDCLASSEX wc = 
  30.     { 
  31.         sizeof( WNDCLASSEX ), CS_CLASSDC, m_d3dWindow.pMsgProc, 0L, 0L, 
  32.         m_d3dWindow.hInst, m_d3dWindow.hIcon, m_d3dWindow.hCursor,
  33.  /*(HBRUSH)(COLOR_WINDOW+1)*/NULL, NULL, 
  34.         m_d3dWindow.lpszClassName, NULL 
  35.     }; 
  36.     RegisterClassEx( &wc ); 
  37.     // 创建程序窗口 
  38.     m_d3dWindow.hWnd = CreateWindowEx( /*WS_EX_LAYERED*/WS_EX_APPWINDOW,
  39. m_d3dWindow.lpszClassName, m_d3dWindow.lpszWindowName, 
  40. WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,  
  41. 0, 0, WND_WIDTH,WND_HEIGHT, 
  42. NULL, NULL, wc.hInstance, NULL ); 
  43.     // 初始化D3D 
  44.     initD3D(); 
  45.     // 将D3DWindow信息反馈给创建结构体 
  46.     memcpy(_pd3dWindow,&m_d3dWindow,sizeof(m_d3dWindow)); 
  47. D3DWindow::~D3DWindow(void
  48.  
  49. // 名称: initD3D() 
  50. // 描述: 创建D3D设备 
  51.  
  52. VOID D3DWindow::initD3D() 
  53.     // 创建D3D对象 
  54.     m_d3dWindow.pD3D = Direct3DCreate9( D3D_SDK_VERSION ); 
  55.     // 获取硬件显示模式 
  56.     m_d3dWindow.pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,
  57.  m_d3dWindow.pd3ddm); 
  58.     // 设置用来创建D3D设备的数组 
  59.     D3DPRESENT_PARAMETERS d3dpp; 
  60.     ZeroMemory( &d3dpp, sizeof( d3dpp ) ); 
  61.     d3dpp.Windowed = TRUE; 
  62.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
  63.     d3dpp.BackBufferWidth = WND_WIDTH; 
  64.     d3dpp.BackBufferHeight = WND_HEIGHT; 
  65.     d3dpp.BackBufferFormat = m_d3dWindow.pd3ddm->Format; 
  66.     d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; 
  67.     d3dpp.EnableAutoDepthStencil = TRUE; 
  68.     d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; 
  69.     // 创建D3D设备 
  70.     m_d3dWindow.pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_d3dWindow.hWnd, 
  71.         D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
  72.         &d3dpp, &m_d3dWindow.pd3dDevice );  
  73.  
  74.     // 关闭裁剪模式和光照 
  75.     m_d3dWindow.pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); 
  76.     m_d3dWindow.pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); 
  77.     // 设置alpha测试 
  78.     m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); 
  79.     m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 64); 
  80.     m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); 
  81.     // 设置alpha混合 
  82.     m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
  83.     m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); 
  84.     m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); 
  85.     // 设置纹理过滤模式 
  86.     m_d3dWindow.pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER,D3DTEXF_LINEAR); 
  87.     m_d3dWindow.pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER,D3DTEXF_LINEAR); 
  88.     // 开启深度缓冲 
  89.     m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE); 
  90.     m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); 
  91.     m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); 
  92.  
  93. // 名称: cleanup() 
  94. // 描述: 释放所有资源 
  95.  
  96. VOID D3DWindow::cleanup() 
  97.     if( m_d3dWindow.pd3dDevice != NULL ) 
  98.         m_d3dWindow.pd3dDevice->Release(); 
  99.     if( m_d3dWindow.pD3D != NULL ) 
  100.         m_d3dWindow.pD3D->Release(); 
  101.     m_d3dWindow.pd3dDevice = NULL; 
  102.     m_d3dWindow.pD3D = NULL; 
  103.  
  104. // 名称: showWindow() 
  105. // 描述: 显示窗口 
  106.  
  107. VOID D3DWindow::showWindow() 
  108. {  
  109.     // 设置窗口大小并移动到屏幕中心 
  110.     RECT windowRect; 
  111.     RECT clientRect; 
  112.     GetWindowRect(m_d3dWindow.hWnd, &windowRect); 
  113.     GetClientRect(m_d3dWindow.hWnd, &clientRect); 
  114.     int width = m_d3dWindow.iWidth + (windowRect.right-windowRect.left)
  115.  - (clientRect.right-clientRect.left); 
  116.     int height = m_d3dWindow.iHeight + (windowRect.bottom-windowRect.top)
  117.  - (clientRect.bottom-clientRect.top); 
  118.     MoveWindow(m_d3dWindow.hWnd, (m_d3dWindow.pd3ddm->Width - width)/2,
  119.  (m_d3dWindow.pd3ddm->Height - height)/2, width, height, TRUE); 
  120.     // 显示窗口 
  121.     ShowWindow( m_d3dWindow.hWnd, SW_SHOWDEFAULT ); 
  122.     UpdateWindow( m_d3dWindow.hWnd ); 
  123.     // 主消息循环 
  124.     MSG msg; 
  125.     ZeroMemory( &msg, sizeof( msg ) ); 
  126.     while( msg.message != WM_QUIT ) 
  127.     { 
  128.         if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) 
  129.         { 
  130.             TranslateMessage( &msg ); 
  131.             DispatchMessage( &msg ); 
  132.         } 
  133.         else 
  134.         { 
  135.             Sleep(1); 
  136.         } 
  137.     } 
  138.     cleanup(); 
  139.     UnregisterClass( m_d3dWindow.lpszClassName, m_d3dWindow.hInst ); 
  140. // 名称: getWindow() 
  141. // 描述: 获得窗口结构体 
  142.  
  143. D3DWINDOW D3DWindow::getWindow() 
  144.     return m_d3dWindow; 
  145.  
  146. // 名称: startRender() 
  147. // 描述: 开始渲染 
  148.  
  149. VOID D3DWindow::startRender() 
  150.     m_d3dWindow.pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
  151.  RGB(255,255,255), 1.0f, 0 ); 
  152.     m_d3dWindow.pd3dDevice->BeginScene(); 
  153.  
  154. // 名称: endRender() 
  155. // 描述: 结束渲染 
  156.  
  157. VOID D3DWindow::endRender() 
  158.     m_d3dWindow.pd3dDevice->EndScene(); 
  159.     m_d3dWindow.pd3dDevice->Present( NULL, NULL, NULL, NULL ); 

 

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201008/9988.html]
本文出处:网络博客 作者:秩名
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容