CGdiPlusBitmap.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #pragma once
  2. class CGdiPlusBitmap
  3. {
  4. public:
  5. Gdiplus::Bitmap* m_pBitmap;
  6. public:
  7. CGdiPlusBitmap() { m_pBitmap = NULL; }
  8. CGdiPlusBitmap(LPCWSTR pFile) { m_pBitmap = NULL; Load(pFile); }
  9. virtual ~CGdiPlusBitmap() { Empty(); }
  10. void Empty() { delete m_pBitmap; m_pBitmap = NULL; }
  11. bool Load(LPCWSTR pFile)
  12. {
  13. Empty();
  14. m_pBitmap = Gdiplus::Bitmap::FromFile(pFile);
  15. return m_pBitmap->GetLastStatus() == Gdiplus::Ok;
  16. }
  17. operator Gdiplus::Bitmap*() const { return m_pBitmap; }
  18. };
  19. class CGdiPlusBitmapResource : public CGdiPlusBitmap
  20. {
  21. protected:
  22. HGLOBAL m_hBuffer;
  23. public:
  24. CGdiPlusBitmapResource() { m_hBuffer = NULL; }
  25. CGdiPlusBitmapResource(LPCTSTR pName, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
  26. { m_hBuffer = NULL; Load(pName, pType, hInst); }
  27. CGdiPlusBitmapResource(UINT id, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
  28. { m_hBuffer = NULL; Load(id, pType, hInst); }
  29. CGdiPlusBitmapResource(UINT id, UINT type, HMODULE hInst = NULL)
  30. { m_hBuffer = NULL; Load(id, type, hInst); }
  31. virtual ~CGdiPlusBitmapResource() { Empty(); }
  32. void Empty();
  33. bool Load(LPCTSTR pName, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL);
  34. bool Load(UINT id, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
  35. { return Load(MAKEINTRESOURCE(id), pType, hInst); }
  36. bool Load(UINT id, UINT type, HMODULE hInst = NULL)
  37. { return Load(MAKEINTRESOURCE(id), MAKEINTRESOURCE(type), hInst); }
  38. };
  39. inline
  40. void CGdiPlusBitmapResource::Empty()
  41. {
  42. CGdiPlusBitmap::Empty();
  43. if (m_hBuffer)
  44. {
  45. ::GlobalUnlock(m_hBuffer);
  46. ::GlobalFree(m_hBuffer);
  47. m_hBuffer = NULL;
  48. }
  49. }
  50. inline
  51. bool CGdiPlusBitmapResource::Load(LPCTSTR pName, LPCTSTR pType, HMODULE hInst)
  52. {
  53. Empty();
  54. HRSRC hResource = ::FindResource(hInst, pName, pType);
  55. if (!hResource)
  56. return false;
  57. DWORD imageSize = ::SizeofResource(hInst, hResource);
  58. if (!imageSize)
  59. return false;
  60. const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource));
  61. if (!pResourceData)
  62. return false;
  63. m_hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
  64. if (m_hBuffer)
  65. {
  66. void* pBuffer = ::GlobalLock(m_hBuffer);
  67. if (pBuffer)
  68. {
  69. CopyMemory(pBuffer, pResourceData, imageSize);
  70. IStream* pStream = NULL;
  71. if (::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK)
  72. {
  73. m_pBitmap = Gdiplus::Bitmap::FromStream(pStream);
  74. pStream->Release();
  75. if (m_pBitmap)
  76. {
  77. if (m_pBitmap->GetLastStatus() == Gdiplus::Ok)
  78. return true;
  79. delete m_pBitmap;
  80. m_pBitmap = NULL;
  81. }
  82. }
  83. ::GlobalUnlock(m_hBuffer);
  84. }
  85. ::GlobalFree(m_hBuffer);
  86. m_hBuffer = NULL;
  87. }
  88. return false;
  89. }