Desktop2DX.cpp
上传用户:wymy58
上传日期:2007-01-07
资源大小:2086k
文件大小:6k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // Desktop2DX.cpp : Defines the class behaviors for the application.
  2. #include "stdafx.h"
  3. #include "Desktop2DX.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. const bool g_bFullScreen
  10. #ifdef _DEBUG
  11. = false; // true;
  12. #else
  13. = true; // false;
  14. #endif // _DEBUG
  15. const DWORD g_dwWidth = 640; // 800; // 1024;
  16. const DWORD g_dwHeight = 480; // 600; // 768;
  17. const DWORD g_dwBPP = 8; // 16; // 24; // 32;
  18. CDesktop2DXApp::CDesktop2DXApp(void)
  19. {
  20. SetFullScreen(g_bFullScreen);
  21. SetPackFileName(_T("."), _T("gui"));
  22. // Called during initial app startup, this function
  23. // performs all the permanent initialization.
  24. m_pDDDevice = NULL;
  25. m_pRenderSurface = NULL;
  26. // add your permanent init code here !
  27. for (int i = 0; i < 4; ++ i)
  28. m_apSurface[i] = NULL;
  29. }
  30. // Called before the app exits, this function gives the app
  31. // the chance to cleanup after itself.
  32. CDesktop2DXApp::~CDesktop2DXApp()
  33. {
  34. // add your cleaup code here !
  35. }
  36. bool CDesktop2DXApp::GetDXInitSettings(void)
  37. {
  38. if (m_pDirectSound != NULL)
  39. {
  40. if (m_pDirectSound->SelectDSDriver(0) == false)
  41. return  false;
  42. }
  43. if (m_pDirectMusic != NULL)
  44. {
  45. if (m_pDirectMusic->SelectDefaultDMusPort() == false)
  46. return  false;
  47. }
  48. if (m_pDirectDraw->SelectDDDevice(0) == false)
  49. return  false;
  50. if (GetFirstDDDevice()->SelectDisplayMode(
  51. IsFullScreen(), g_dwWidth, g_dwHeight, g_dwBPP) == false)
  52. return  false;
  53. CDC dc;
  54. dc.Attach(::GetDC(NULL));
  55. if (m_pDirectDraw->GetFirstEnableDevice()->SelectDisplayMode(
  56. IsFullScreen(),
  57. dc.GetDeviceCaps(HORZRES),
  58. dc.GetDeviceCaps(VERTRES),
  59. dc.GetDeviceCaps(BITSPIXEL)/*8*/) == false)
  60. return  false;
  61. m_dc.CreateCompatibleDC(&dc);
  62. m_bmp.CreateCompatibleBitmap(&dc,
  63. dc.GetDeviceCaps(HORZRES),
  64. dc.GetDeviceCaps(VERTRES));
  65. // Select the bitmaps into the compatible DC.
  66. m_pOldBMP = m_dc.SelectObject(&m_bmp);
  67. BOOL bRet = m_dc.BitBlt(0, 0,
  68. dc.GetDeviceCaps(HORZRES),
  69. dc.GetDeviceCaps(VERTRES),
  70. &dc,
  71. 0,
  72. 0,
  73. SRCCOPY);
  74. ::ReleaseDC(NULL, dc.Detach());
  75. dc.DeleteDC();
  76. if (bRet == FALSE)
  77. return  false;
  78. return  true;
  79. }
  80. // Called during device intialization, this code checks the device
  81. // for some minimum set of capabilities, Initialize scene objects.
  82. bool CDesktop2DXApp::InitDXObjects(void)
  83. {
  84. m_pDDDevice = GetFirstDDDevice();
  85. m_pRenderSurface = m_pDDDevice->GetRenderSurface();
  86. // add your init code here !
  87. for (int  i = 0; i < 4; ++ i)
  88. {
  89. m_apSurface[i] = new  CDDSurface;
  90. if (m_apSurface[i]->Create(m_pDDDevice,
  91. m_pDDDevice->GetWidth() / 2,
  92. m_pDDDevice->GetHeight() / 2) == false)
  93. return  false;
  94. }
  95. CDC dc;
  96. for (i = 0; i < 4; ++ i)
  97. {
  98. m_arcDest[i].left = (i & 1) ? m_pDDDevice->GetWidth() / 2 : 0;
  99. m_arcDest[i].top = (i >> 1) ? m_pDDDevice->GetHeight() / 2 : 0;
  100. m_arcDest[i].right = m_arcDest[i].left + m_pDDDevice->GetWidth() / 2;
  101. m_arcDest[i].bottom = m_arcDest[i].top + m_pDDDevice->GetHeight() / 2;
  102. if (SUCCEEDED(m_apSurface[i]->GetDC(dc)))
  103. {
  104. dc.BitBlt(0, 0,
  105. m_apSurface[i]->GetWidth(),
  106. m_apSurface[i]->GetHeight(),
  107. &m_dc,
  108. m_arcDest[i].left,
  109. m_arcDest[i].top,
  110. SRCCOPY);
  111. m_apSurface[i]->ReleaseDC(dc);
  112. }
  113. }
  114. dc.DeleteDC();
  115. return  true;
  116. }
  117. // Called when the app is exitting, or the device is being changed,
  118. // this function deletes any device dependant objects.
  119. bool CDesktop2DXApp::DestroyDXObjects(void)
  120. {
  121. // add your destroy code here !
  122. m_dc.SelectObject(m_pOldBMP);
  123. m_bmp.DeleteObject();
  124. m_dc.DeleteDC();
  125. for (int  i = 0; i < 4; ++ i)
  126. {
  127. if (m_apSurface[i] != NULL)
  128. {
  129. delete  m_apSurface[i];
  130. m_apSurface[i] = NULL;
  131. }
  132. }
  133. m_pRenderSurface = NULL;
  134. m_pDDDevice = NULL;
  135. return  CDirectXApp::DestroyDXObjects();
  136. }
  137. // Called once per frame, the call is the entry point for
  138. // animating the scene. This function sets up render states,
  139. // clears the viewport, and renders the scene.
  140. bool CDesktop2DXApp::UpdateFrame(void)
  141. {
  142. // add your code here !
  143. static int nStep=1;
  144. m_pRenderSurface->Fill(0);
  145. if (m_arcDest[3].left < m_arcDest[3].right - nStep)
  146. m_arcDest[3].left += nStep;
  147. if (m_arcDest[3].top < m_arcDest[3].bottom - nStep)
  148. m_arcDest[3].top += nStep;
  149. if (m_arcDest[2].right > m_arcDest[2].left + nStep)
  150. m_arcDest[2].right -= nStep;
  151. if (m_arcDest[2].top < m_arcDest[2].bottom - nStep)
  152. m_arcDest[2].top += nStep;
  153. if (m_arcDest[1].left < m_arcDest[1].right - nStep)
  154. m_arcDest[1].left += nStep;
  155. if (m_arcDest[1].bottom > m_arcDest[1].top + nStep)
  156. m_arcDest[1].bottom -= nStep;
  157. if (m_arcDest[0].right > m_arcDest[0].left + nStep)
  158. m_arcDest[0].right -= nStep;
  159. if (m_arcDest[0].bottom > m_arcDest[0].top + nStep)
  160. m_arcDest[0].bottom -= nStep;
  161. for (int  i = 0; i < sizeof(m_apSurface) / sizeof(CDDSurface*); ++ i)
  162. {
  163. m_apSurface[i]->Draw(
  164. m_pDDDevice->GetRenderSurface(),
  165. &m_arcDest[i]);
  166. }
  167. nStep += 2;
  168. return  CDirectXApp::UpdateFrame();
  169. }
  170. // ---- add your functions ! ----
  171. // ----
  172. #if _MSC_VER >= 1200 && _MSC_VER < 1400
  173. #ifdef _DEBUG
  174. #pragma comment(lib, "DXGuideD_VC6.lib")
  175. #else
  176. #pragma comment(lib, "DXGuide_VC6.lib")
  177. #endif // _DEBUG
  178. #endif // _MSC_VER
  179. #if _MSC_VER >= 1000 && _MSC_VER < 1200
  180. #ifdef _DEBUG
  181. #pragma comment(lib, "DXGuideD_VC5.lib")
  182. #else
  183. #pragma comment(lib, "DXGuide_VC5.lib")
  184. #endif // _DEBUG
  185. #endif // _MSC_VER
  186. BEGIN_MESSAGE_MAP(CDesktop2DXApp, CDirectXApp)
  187. //{{AFX_MSG_MAP(CDesktop2DXApp)
  188. //}}AFX_MSG_MAP
  189. END_MESSAGE_MAP()
  190. CDesktop2DXApp theApp;