cApplication.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:6k
源码类别:

游戏

开发平台:

Visual C++

  1. // CMAIN LIB - APPLICATION AND DIRECT WRAPPER
  2. //
  3. // Written by Mauricio Teichmann Ritter
  4. //
  5. // Copyright (C) 2002, Brazil. All rights reserved.
  6. // 
  7. //
  8. #include "cApplication.h"
  9. cApplication* CreateApplication();
  10. cApplication* pApp;
  11. cApplication* GetMainApp()
  12. {
  13. return pApp;
  14. }
  15. long FAR PASCAL MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
  16. {
  17.     switch( message )
  18.     {
  19.     case WM_SIZE:
  20.         // Check to see if we are losing our window...
  21.         if( SIZE_MAXHIDE==wParam || SIZE_MINIMIZED==wParam )
  22.             GetMainApp()->m_bActive = FALSE;
  23.         else
  24.             GetMainApp()->m_bActive = TRUE;
  25.         break;
  26. case WM_CREATE:
  27.         break;
  28. case WM_CLOSE:
  29.     case WM_DESTROY:
  30.         PostQuitMessage(0);
  31.         break;
  32.     default:
  33.         break;
  34.     }
  35.     return DefWindowProc(hWnd, message, wParam, lParam);
  36. } /* MainWndproc */
  37. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int iCmdShow)
  38. {
  39. cApplication::m_hInst = hInst;
  40. pApp = CreateApplication();
  41. CoInitialize(NULL);
  42. if(!pApp->InitApplication())
  43. {
  44. MessageBox(NULL, "Error Starting up application.n Close all open programs and try again.", "Error", MB_ICONERROR);
  45. return 0;
  46. }
  47. if(!pApp->InitDirectX())
  48. {
  49. MessageBox(NULL, "Error Starting up DirectX.n Check if you have Microsoft DirectX correctly installed on your machine.n You can download the latest version from http://www.microsoft.com/directx.", "Error", MB_ICONERROR);
  50. return 0;
  51. }
  52. // Call virtual function to tell the derived class that with
  53. // have setup everything
  54. pApp->AppInitialized();
  55. // Start Message Loop
  56. pApp->RunApplication();
  57. delete pApp;
  58. return 0;
  59. }
  60. cApplication::cApplication()
  61. {
  62. m_pDD          = NULL;
  63. m_pFrontBuffer = NULL;
  64. m_pBackBuffer  = NULL;
  65. m_ColorDepth   = 16;
  66. m_ScreenWidth  = 640;
  67. m_ScreenHeight = 480;
  68. m_bDontFlip = false;
  69. m_bActive = TRUE;
  70. };
  71. cApplication::~cApplication()
  72. {
  73.     // Time for cleanup
  74. //     
  75.     if( m_pBackBuffer != NULL )
  76.         m_pBackBuffer->Release();
  77. if( m_pFrontBuffer != NULL )
  78.         m_pFrontBuffer->Release();
  79.     if( m_pDD != NULL )
  80.         m_pDD->Release();
  81. CoUninitialize();
  82. };
  83. HINSTANCE cApplication::m_hInst = NULL;
  84. void cApplication::DoIdle()
  85. {
  86. return;
  87. }
  88. BOOL cApplication::InitApplication()
  89. {
  90. m_bActive = TRUE;
  91. // First Try to register the window
  92. if(FAILED(m_pWindow.RegisterWindow(m_lpszwndClassName)))
  93. return FALSE;
  94. // Then try to create it
  95. if(!m_pWindow.Create(m_lpszAppName))
  96. return FALSE;
  97. return TRUE;
  98. }
  99. BOOL cApplication::RunApplication()
  100. {
  101. // MessageLoop implementation
  102. // The DoIdle function is a virtual function that can be implemented
  103. // In the derived class
  104.     MSG            msg; 
  105. BOOL    bContinue = TRUE;
  106. HRESULT    hRet;
  107.     while (bContinue) 
  108. {
  109. // Check the message pool
  110. if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
  111.         {
  112.             if(msg.message == WM_QUIT)
  113. {
  114. ExitApp();
  115. }
  116. if( !GetMessage( &msg, NULL, 0, 0 ) )
  117.             {
  118.                 return msg.wParam;
  119.             }
  120.             TranslateMessage(&msg);
  121.             DispatchMessage(&msg);
  122.         }
  123. else
  124. {
  125. // Nothing to do... idle;
  126. DoIdle();
  127. if(pApp->m_bActive)
  128. {
  129. if(m_bDontFlip == false)
  130. {
  131. hRet = m_pFrontBuffer->Flip(NULL, 0 );
  132. if(hRet != DD_OK)
  133. {
  134. DXTRACE_MSG("Error Flipping Front Buffer !n");
  135. }
  136. }
  137. else
  138. m_bDontFlip = false;
  139. }
  140. else
  141. {
  142. WaitMessage();
  143. }
  144. }
  145. }
  146.     return TRUE;
  147. }
  148. BOOL cApplication::InitDirectX()
  149. {
  150. HRESULT hRet;
  151. LPDIRECTDRAW pDD;
  152.     DDSURFACEDESC2 ddsd;
  153.     DDSCAPS2 ddscaps;
  154. // First of all, create the DirectX object
  155. hRet = DirectDrawCreate( NULL, &pDD, NULL );
  156. if(hRet != DD_OK)
  157. {
  158. // if failed, quit the app
  159. return FALSE;
  160. }
  161.     // Fetch DirectDraw7 interface
  162.     hRet = pDD->QueryInterface(IID_IDirectDraw7, (LPVOID*)&m_pDD);
  163. if(hRet != DD_OK)
  164. {
  165. // if failed, quit the app
  166. return FALSE;
  167. }
  168. // Since we don磘 need this DirectDraw interface anymore, release it
  169. pDD->Release();
  170.     
  171. // Set cooperative level to fullscreenn
  172. hRet = m_pDD->SetCooperativeLevel(m_pWindow.GetHWnd(), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
  173. if(hRet != DD_OK)
  174. {
  175. // if failed, quit the app
  176. return FALSE;
  177. }
  178.     
  179. // Set Display mode
  180.     hRet = m_pDD->SetDisplayMode(m_ScreenWidth, m_ScreenHeight, m_ColorDepth, 0, 0 );
  181. if(hRet != DD_OK)
  182. {
  183. // if failed, quit the app
  184. return FALSE;
  185. }
  186.     // Create Main Surfaces
  187. // We磍l not use cSurface here because we only need reference of this
  188. // two guys
  189.     ZeroMemory( &ddsd, sizeof( ddsd ) );
  190.     ddsd.dwSize = sizeof( ddsd );
  191.     ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  192.     
  193. ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
  194.                           DDSCAPS_FLIP |
  195.                           DDSCAPS_COMPLEX;
  196.     ddsd.dwBackBufferCount = 1;
  197.     
  198. hRet = m_pDD->CreateSurface(&ddsd, &m_pFrontBuffer, NULL );
  199. if(hRet != DD_OK)
  200. {
  201. // if failed, quit the app
  202. return FALSE;
  203. }
  204.     // get a pointer to the back buffer
  205.     
  206. ZeroMemory(&ddscaps, sizeof(ddscaps));
  207. ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  208.     hRet = m_pFrontBuffer->GetAttachedSurface(
  209.                 &ddscaps,
  210.                 &m_pBackBuffer);
  211. if(hRet != DD_OK)
  212. {
  213. // if failed, quit the app
  214. return FALSE;
  215. }
  216. // All OK ! :)
  217. return TRUE;
  218. }
  219. LPDIRECTDRAW7 cApplication::GetDirectDraw()
  220. {
  221. return m_pDD;
  222. }
  223. void cApplication::AppInitialized()
  224. {
  225. }
  226. void cApplication::ExitApp()
  227. {
  228. }
  229. HWND cApplication::GetMainWnd()
  230. {
  231. return m_pWindow.GetHWnd();
  232. }
  233. void cApplication::PreventFlip()
  234. {
  235. m_bDontFlip = true;
  236. }
  237. #ifdef _DEBUG
  238. void Log(char* sFormat, ...)
  239. {
  240. FILE*  pFile;
  241. char buffer[1024];
  242. va_list marker;
  243. va_start( marker, sFormat );
  244. pFile = fopen("log.txt", "a+");
  245. vsprintf(buffer, sFormat, marker);
  246. fputs(buffer, pFile);
  247. OutputDebugString(buffer);
  248. va_end( marker );
  249. fclose(pFile);
  250. }
  251. #endif