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

游戏

开发平台:

Visual C++

  1. // cSurface.cpp: implementation of the cSurface class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "cSurface.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. cSurface::cSurface()
  10. {
  11. m_pSurface = NULL;
  12. m_ColorKey = -1;
  13. }
  14. cSurface::cSurface(HINSTANCE hInst, UINT nResource, int nWidth, int nHeight, COLORREF dwColorKey)
  15. {
  16. m_pSurface = NULL;
  17. m_ColorKey = -1;
  18. Create(nWidth, nHeight, dwColorKey);
  19. this->LoadBitmap(hInst, nResource);
  20. }
  21. cSurface::~cSurface()
  22. {
  23. if(m_pSurface != NULL)
  24. {
  25. OutputDebugString("Surface Destroyedn");
  26. m_pSurface->Release();
  27. m_pSurface = NULL;
  28. }
  29. }
  30. BOOL cSurface::LoadBitmap(HINSTANCE hInst, UINT nRes, int nX, int nY, int nWidth, int nHeight)
  31. {
  32.     HDC                     hdcImage;
  33.     HDC                     hdc;
  34.     BITMAP                  bm;
  35.     DDSURFACEDESC2          ddsd;
  36.     HRESULT                 hr;
  37. HBITMAP hbm;
  38. hbm = (HBITMAP) LoadImage(hInst, MAKEINTRESOURCE(nRes), IMAGE_BITMAP, nWidth, nHeight, 0L);
  39.     if (hbm == NULL || m_pSurface == NULL)
  40.         return FALSE;
  41.     //确保要重置曲面
  42.     m_pSurface->Restore();
  43.     //要把位图载入到memoryDC中
  44.     hdcImage = CreateCompatibleDC(NULL);
  45.     if (!hdcImage)
  46.         return FALSE;
  47. //将位图载入到MemoryDC
  48.     SelectObject(hdcImage, hbm);
  49.     //从位图句柄得到位图结构
  50.     GetObject(hbm, sizeof(bm), &bm);
  51. //获得位图宽度和高度
  52. if(nWidth == 0)
  53. nWidth = bm.bmWidth;
  54. if(nHeight == 0)
  55. nHeight = bm.bmHeight;
  56.     
  57.     //得到曲面大小信息
  58.     ddsd.dwSize = sizeof(ddsd);
  59.     ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
  60.     m_pSurface->GetSurfaceDesc(&ddsd);
  61.     if ((hr = m_pSurface->GetDC(&hdc)) == DD_OK)
  62.     {
  63.         StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, nX, nY,
  64.                    nWidth, nHeight, SRCCOPY);
  65.         m_pSurface->ReleaseDC(hdc);
  66.     }
  67.     DeleteDC(hdcImage);
  68. return TRUE;
  69. }
  70. BOOL cSurface::Create(int nWidth, int nHeight, COLORREF dwColorKey)
  71. {
  72.     DDSURFACEDESC2 ddsd;
  73. HRESULT hRet;
  74.     DDCOLORKEY          ddck;
  75. m_ColorKey = dwColorKey;
  76.     ZeroMemory( &ddsd, sizeof( ddsd ) );
  77.     ddsd.dwSize = sizeof( ddsd );
  78. ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  79.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  80.   DDSCAPS_SYSTEMMEMORY;
  81. ddsd.dwWidth  = nWidth;
  82.     ddsd.dwHeight = nHeight;
  83. //根据ddsd对曲面描述,创建一个曲面m_pSurface。
  84.     hRet = GetDirectDraw()->CreateSurface(&ddsd, &m_pSurface, NULL );
  85.     if( hRet != DD_OK )
  86. {
  87. DXTRACE_MSG("DirectDraw Surface Creation Failed");
  88.         return FALSE;
  89. }
  90. if((int)dwColorKey != -1)
  91. {
  92. ddck.dwColorSpaceLowValue = dwColorKey;
  93. ddck.dwColorSpaceHighValue = 0;
  94. //设置m_pSurface底色
  95. m_pSurface->SetColorKey(DDCKEY_SRCBLT, &ddck);
  96. }
  97. //设置曲面高度和宽度
  98. m_Width  = nWidth;
  99. m_Height = nHeight;
  100. return TRUE;
  101. }
  102. BOOL cSurface::Draw(LPDIRECTDRAWSURFACE7 lpDest, int iDestX, int iDestY, int iSrcX, int iSrcY, int nWidth, int nHeight)
  103. {
  104. RECT rcRect;
  105. if(nWidth == 0 && nHeight == 0)
  106. {
  107. nWidth = m_Width;
  108. nHeight = m_Height;
  109. }
  110. rcRect.left   = iSrcX;
  111. rcRect.top    = iSrcY;
  112. rcRect.right  = nWidth  + iSrcX;
  113. rcRect.bottom = nHeight + iSrcY;
  114. if((int)m_ColorKey < 0)
  115. {
  116. //非透明的彩色拷贝
  117. lpDest->BltFast(iDestX, iDestY, m_pSurface, &rcRect,  DDBLTFAST_NOCOLORKEY);
  118. }
  119. else
  120. {
  121. //透明的彩色拷贝
  122. lpDest->BltFast(iDestX, iDestY, m_pSurface, &rcRect,  DDBLTFAST_SRCCOLORKEY);
  123. }
  124. return TRUE;
  125. }
  126. void cSurface::Destroy()
  127. {
  128. if(m_pSurface != NULL)
  129. {
  130. m_pSurface->Release();
  131. m_pSurface = NULL;
  132. }
  133. }
  134. UINT cSurface::Height()
  135. {
  136. return m_Height;
  137. }
  138. UINT cSurface::Width()
  139. {
  140. return m_Width;
  141. }
  142. LPDIRECTDRAWSURFACE7 cSurface::GetSurface()
  143. {
  144. return m_pSurface;
  145. }