D3DEnvClass.cpp
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:2k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. //--------------------------------------------------------------------------------------
  2. // 实现文件: D3DEnvClass.cpp, 作者:曾凡喜
  3. //
  4. // 版权归作者所有,不得用于商业用途
  5. //
  6. // 完成时间:2007-10-31
  7. //--------------------------------------------------------------------------------------
  8. #include "StdAfx.h"
  9. #include ".d3denvclass.h"
  10. CZFXD3DEnv::CZFXD3DEnv(void)
  11. {
  12. m_pD3D = NULL;
  13. m_pd3dDevice = NULL;
  14. }
  15. CZFXD3DEnv::~CZFXD3DEnv(void)
  16. {
  17. }
  18. HRESULT CZFXD3DEnv::InitD3D(BOOL bWindowed, HWND hWnd)
  19. {
  20. // 创建D3D对象
  21. if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION )))
  22. {
  23. ::MessageBox(0, "Create D3D Object FAILED", 0, 0);
  24. return E_FAIL;
  25. }
  26. //得到当前的显示模式
  27. D3DDISPLAYMODE d3ddm;
  28. if( FAILED( m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm )))
  29. {
  30. ::MessageBox(0, "Get Adapter Display Mode Failed", 0, 0);
  31. return E_FAIL;
  32. }
  33. ZeroMemory( &m_d3dpp, sizeof(m_d3dpp));
  34. if(!bWindowed)
  35. {
  36. // 全屏模式
  37. m_d3dpp.hDeviceWindow = hWnd;
  38. m_d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
  39. m_d3dpp.BackBufferCount = 1; //有一个后台缓存
  40. m_d3dpp.BackBufferWidth = d3ddm.Width;//屏幕宽度为800像素
  41. m_d3dpp.BackBufferHeight = d3ddm.Height;//屏幕长度为600像素
  42. m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
  43. }
  44. else
  45. {
  46. // 窗口模式
  47. m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  48. }
  49. m_d3dpp.Windowed = bWindowed;
  50. m_d3dpp.BackBufferFormat = d3ddm.Format;
  51. m_d3dpp.EnableAutoDepthStencil = TRUE;
  52. m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
  53. // 创建D3D设备
  54. if( FAILED( m_pD3D -> CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  55. D3DCREATE_MIXED_VERTEXPROCESSING, &m_d3dpp, &m_pd3dDevice)))
  56. {
  57. ::MessageBox(0, "Create D3D Device FAILED", 0, 0);
  58. return E_FAIL;
  59. }
  60. D3DCAPS9 caps;
  61. m_pd3dDevice->GetDeviceCaps(&caps);
  62. return D3D_OK;
  63. }
  64. void CZFXD3DEnv::MakeSureNotLost()
  65. {
  66. HRESULT result = m_pd3dDevice->TestCooperativeLevel();
  67. while(result != D3D_OK)
  68. {
  69. while(result != D3DERR_DEVICENOTRESET)
  70. {
  71. Sleep(1000);
  72. result = m_pd3dDevice->TestCooperativeLevel();
  73. }
  74. if(FAILED(m_pd3dDevice->Reset(&m_d3dpp)))
  75. result = D3DERR_DEVICELOST;
  76. }
  77. }
  78. void CZFXD3DEnv::Release()
  79. {
  80. if( m_pD3D != NULL)
  81. m_pD3D->Release();
  82. if( m_pd3dDevice != NULL)
  83. m_pd3dDevice->Release();
  84. }