Bitmap.cpp
上传用户:slhang369
上传日期:2022-04-19
资源大小:2452k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual Basic

  1. //-----------------------------------------------------------------
  2. // Bitmap Object
  3. // C++ Source - Bitmap.cpp
  4. //-----------------------------------------------------------------
  5. //-----------------------------------------------------------------
  6. // Include Files
  7. //-----------------------------------------------------------------
  8. #include "Bitmap.h"
  9. //-----------------------------------------------------------------
  10. // Bitmap Constructor(s)/Destructor
  11. //-----------------------------------------------------------------
  12. Bitmap::Bitmap()
  13.   : m_hBitmap(NULL), m_iWidth(0), m_iHeight(0)
  14. {
  15. }
  16. // Create a bitmap from a file
  17. Bitmap::Bitmap(HDC hDC, LPTSTR szFileName)
  18.   : m_hBitmap(NULL), m_iWidth(0), m_iHeight(0)
  19. {
  20.   Create(hDC, szFileName);
  21. }
  22. // Create a bitmap from a resource
  23. Bitmap::Bitmap(HDC hDC, UINT uiResID, HINSTANCE hInstance)
  24.   : m_hBitmap(NULL), m_iWidth(0), m_iHeight(0)
  25. {
  26.   Create(hDC, uiResID, hInstance);
  27. }
  28. // Create a blank bitmap from scratch
  29. Bitmap::Bitmap(HDC hDC, int iWidth, int iHeight, COLORREF crColor)
  30.   : m_hBitmap(NULL), m_iWidth(0), m_iHeight(0)
  31. {
  32.   Create(hDC, iWidth, iHeight, crColor);
  33. }
  34. Bitmap::~Bitmap()
  35. {
  36.   Free();
  37. }
  38. //-----------------------------------------------------------------
  39. // Bitmap Helper Methods
  40. //-----------------------------------------------------------------
  41. void Bitmap::Free()
  42. {
  43.   // Delete the bitmap graphics object
  44.   if (m_hBitmap != NULL)
  45.   {
  46.     DeleteObject(m_hBitmap);
  47.     m_hBitmap = NULL;
  48.   }
  49. }
  50. //-----------------------------------------------------------------
  51. // Bitmap General Methods
  52. //-----------------------------------------------------------------
  53. BOOL Bitmap::Create(HDC hDC, LPTSTR szFileName)
  54. {
  55.   // Free any previous bitmap info
  56.   Free();
  57.   // Open the bitmap file
  58.   HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
  59.     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  60.   if (hFile == INVALID_HANDLE_VALUE)
  61.     return FALSE;
  62.   // Read the bitmap file header
  63.   BITMAPFILEHEADER  bmfHeader;
  64.   DWORD             dwBytesRead;
  65.   BOOL bOK = ReadFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER),
  66.     &dwBytesRead, NULL);
  67.   if ((!bOK) || (dwBytesRead != sizeof(BITMAPFILEHEADER)) ||
  68.     (bmfHeader.bfType != 0x4D42))
  69.   {
  70.     CloseHandle(hFile);
  71.     return FALSE;
  72.   }
  73.   BITMAPINFO* pBitmapInfo = (new BITMAPINFO);
  74.   if (pBitmapInfo != NULL)
  75.   {
  76.     // Read the bitmap info header
  77.     bOK = ReadFile(hFile, pBitmapInfo, sizeof(BITMAPINFOHEADER),
  78.       &dwBytesRead, NULL);
  79.     if ((!bOK) || (dwBytesRead != sizeof(BITMAPINFOHEADER)))
  80.     {
  81.       CloseHandle(hFile);
  82.       Free();
  83.       return FALSE;
  84.     }
  85.     // Store the width and height of the bitmap
  86.     m_iWidth = (int)pBitmapInfo->bmiHeader.biWidth;
  87.     m_iHeight = (int)pBitmapInfo->bmiHeader.biHeight;
  88.     // Get a handle to the bitmap and copy the image bits
  89.     PBYTE pBitmapBits;
  90.     m_hBitmap = CreateDIBSection(hDC, pBitmapInfo, DIB_RGB_COLORS,
  91.       (PVOID*)&pBitmapBits, NULL, 0);
  92.     if ((m_hBitmap != NULL) && (pBitmapBits != NULL))
  93.     {
  94.       SetFilePointer(hFile, bmfHeader.bfOffBits, NULL, FILE_BEGIN);
  95.       bOK = ReadFile(hFile, pBitmapBits, pBitmapInfo->bmiHeader.biSizeImage,
  96.         &dwBytesRead, NULL);
  97.       if (bOK)
  98.         return TRUE;
  99.     }
  100.   }
  101.   // Something went wrong, so cleanup everything
  102.   Free();
  103.   return FALSE;
  104. }
  105. BOOL Bitmap::Create(HDC hDC, UINT uiResID, HINSTANCE hInstance)
  106. {
  107.   // Free any previous DIB info
  108.   Free();
  109.   // Find the bitmap resource
  110.   HRSRC hResInfo = FindResource(hInstance, MAKEINTRESOURCE(uiResID), RT_BITMAP);
  111.   if (hResInfo == NULL)
  112.     return FALSE;
  113.   // Load the bitmap resource
  114.   HGLOBAL hMemBitmap = LoadResource(hInstance, hResInfo);
  115.   if (hMemBitmap == NULL)
  116.     return FALSE;
  117.   // Lock the resource and access the entire bitmap image
  118.   PBYTE pBitmapImage = (BYTE*)LockResource(hMemBitmap);
  119.   if (pBitmapImage == NULL)
  120.   {
  121.     FreeResource(hMemBitmap);
  122.     return FALSE;
  123.   }
  124.   // Store the width and height of the bitmap
  125.   BITMAPINFO* pBitmapInfo = (BITMAPINFO*)pBitmapImage;
  126.   m_iWidth = (int)pBitmapInfo->bmiHeader.biWidth;
  127.   m_iHeight = (int)pBitmapInfo->bmiHeader.biHeight;
  128.   // Get a handle to the bitmap and copy the image bits
  129.   PBYTE pBitmapBits;
  130.   m_hBitmap = CreateDIBSection(hDC, pBitmapInfo, DIB_RGB_COLORS,
  131.     (PVOID*)&pBitmapBits, NULL, 0);
  132.   if ((m_hBitmap != NULL) && (pBitmapBits != NULL))
  133.   {
  134.     const PBYTE pTempBits = pBitmapImage + pBitmapInfo->bmiHeader.biSize +
  135.       pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD);
  136.     CopyMemory(pBitmapBits, pTempBits, pBitmapInfo->bmiHeader.biSizeImage);
  137.     // Unlock and free the bitmap graphics object
  138.     UnlockResource(hMemBitmap);
  139.     FreeResource(hMemBitmap);
  140.     return TRUE;
  141.   }
  142.   // Something went wrong, so cleanup everything
  143.   UnlockResource(hMemBitmap);
  144.   FreeResource(hMemBitmap);
  145.   Free();
  146.   return FALSE;
  147. }
  148. BOOL Bitmap::Create(HDC hDC, int iWidth, int iHeight, COLORREF crColor)
  149. {
  150.   // Create a blank bitmap
  151.   m_hBitmap = CreateCompatibleBitmap(hDC, iWidth, iHeight);
  152.   if (m_hBitmap == NULL)
  153.     return FALSE;
  154.   // Set the width and height
  155.   m_iWidth = iWidth;
  156.   m_iHeight = iHeight;
  157.   // Create a memory device context to draw on the bitmap
  158.   HDC hMemDC = CreateCompatibleDC(hDC);
  159.   // Create a solid brush to fill the bitmap
  160.   HBRUSH hBrush = CreateSolidBrush(crColor);
  161.   // Select the bitmap into the device context
  162.   HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, m_hBitmap);
  163.   // Fill the bitmap with a solid color
  164.   RECT rcBitmap = { 0, 0, m_iWidth, m_iHeight };
  165.   FillRect(hMemDC, &rcBitmap, hBrush);
  166.   // Cleanup
  167.   SelectObject(hMemDC, hOldBitmap);
  168.   DeleteDC(hMemDC);
  169.   DeleteObject(hBrush);
  170.   return TRUE;
  171. }
  172. void Bitmap::Draw(HDC hDC, int x, int y, BOOL bTrans, COLORREF crTransColor)
  173. {
  174.   if (m_hBitmap != NULL)
  175.   {
  176.     // Create a memory device context for the bitmap
  177.     HDC hMemDC = CreateCompatibleDC(hDC);
  178.     // Select the bitmap into the device context
  179.     HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, m_hBitmap);
  180.     // Draw the bitmap to the destination device context
  181.     if (bTrans)
  182.       TransparentBlt(hDC, x, y, GetWidth(), GetHeight(), hMemDC, 0, 0,
  183.         GetWidth(), GetHeight(), crTransColor);
  184.     else
  185.       BitBlt(hDC, x, y, GetWidth(), GetHeight(), hMemDC, 0, 0, SRCCOPY);
  186.     // Restore and delete the memory device context
  187.     SelectObject(hMemDC, hOldBitmap);
  188.     DeleteDC(hMemDC);
  189.   }
  190. }