CGdiPlusBitmap.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. bool Loads(LPCWSTR pFile)
  18. {
  19. Empty();
  20. m_pBitmap = Gdiplus::Bitmap::FromFile(pFile);
  21. return m_pBitmap->GetLastStatus() == Gdiplus::Ok;
  22. }
  23. operator Gdiplus::Bitmap*() const { return m_pBitmap; }
  24. };
  25. class CGdiPlusBitmapResource : public CGdiPlusBitmap
  26. {
  27. protected:
  28. HGLOBAL m_hBuffer;
  29. public:
  30. CGdiPlusBitmapResource() { m_hBuffer = NULL; }
  31. CGdiPlusBitmapResource(LPCTSTR pName, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
  32. { m_hBuffer = NULL; Load(pName, pType, hInst); }
  33. CGdiPlusBitmapResource(UINT id, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
  34. { m_hBuffer = NULL; Load(id, pType, hInst); }
  35. CGdiPlusBitmapResource(UINT id, UINT type, HMODULE hInst = NULL)
  36. { m_hBuffer = NULL; Load(id, type, hInst); }
  37. virtual ~CGdiPlusBitmapResource() { Empty(); }
  38. void Empty();
  39. bool Load(LPCTSTR pName, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL);
  40. bool Load(UINT id, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
  41. { return Load(MAKEINTRESOURCE(id), pType, hInst); }
  42. bool Load(UINT id, UINT type, HMODULE hInst = NULL)
  43. { return Load(MAKEINTRESOURCE(id), MAKEINTRESOURCE(type), hInst); }
  44. bool LoadRaw(unsigned char* bitmapData, int imageSize)
  45. {
  46. /*bool ret = false;
  47. CString path;
  48. wchar_t wchPath[MAX_PATH];
  49. if (GetTempPathW(MAX_PATH, wchPath))
  50. {
  51. path = wchPath;
  52. path += "qrcode.bmp";
  53. }
  54. FILE* f = _wfopen(path.GetBuffer(MAX_PATH), _T("wb"));
  55. if (f != NULL)
  56. {
  57. fwrite(bitmapData, imageSize, 1, f);
  58. fclose(f);
  59. }
  60. m_pBitmap = Gdiplus::Bitmap::FromFile(path);
  61. if (m_pBitmap)
  62. {
  63. Status s = m_pBitmap->GetLastStatus();
  64. if (m_pBitmap->GetLastStatus() != Gdiplus::Ok)
  65. {
  66. delete m_pBitmap;
  67. m_pBitmap = NULL;
  68. }
  69. else
  70. {
  71. ret = true;
  72. }
  73. }
  74. ::DeleteFile(path);*/
  75. Empty();
  76. m_hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
  77. if (m_hBuffer)
  78. {
  79. void* pBuffer = ::GlobalLock(m_hBuffer);
  80. if (pBuffer)
  81. {
  82. CopyMemory(pBuffer, bitmapData, imageSize);
  83. IStream* pStream = NULL;
  84. if (::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK)
  85. {
  86. m_pBitmap = Gdiplus::Bitmap:: FromStream(pStream);
  87. pStream->Release();
  88. if (m_pBitmap)
  89. {
  90. if (m_pBitmap->GetLastStatus() == Gdiplus::Ok)
  91. return true;
  92. delete m_pBitmap;
  93. m_pBitmap = NULL;
  94. }
  95. }
  96. ::GlobalUnlock(m_hBuffer);
  97. }
  98. ::GlobalFree(m_hBuffer);
  99. m_hBuffer = NULL;
  100. }
  101. return false;
  102. //return ret;
  103. }
  104. };
  105. inline
  106. void CGdiPlusBitmapResource::Empty()
  107. {
  108. CGdiPlusBitmap::Empty();
  109. if (m_hBuffer)
  110. {
  111. ::GlobalUnlock(m_hBuffer);
  112. ::GlobalFree(m_hBuffer);
  113. m_hBuffer = NULL;
  114. }
  115. }
  116. inline
  117. bool CGdiPlusBitmapResource::Load(LPCTSTR pName, LPCTSTR pType, HMODULE hInst)
  118. {
  119. Empty();
  120. HRSRC hResource = ::FindResource(hInst, pName, pType);
  121. if (!hResource)
  122. return false;
  123. DWORD imageSize = ::SizeofResource(hInst, hResource);
  124. if (!imageSize)
  125. return false;
  126. const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource));
  127. if (!pResourceData)
  128. return false;
  129. m_hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
  130. if (m_hBuffer)
  131. {
  132. void* pBuffer = ::GlobalLock(m_hBuffer);
  133. if (pBuffer)
  134. {
  135. CopyMemory(pBuffer, pResourceData, imageSize);
  136. IStream* pStream = NULL;
  137. if (::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK)
  138. {
  139. m_pBitmap = Gdiplus::Bitmap:: FromStream(pStream);
  140. pStream->Release();
  141. if (m_pBitmap)
  142. {
  143. if (m_pBitmap->GetLastStatus() == Gdiplus::Ok)
  144. return true;
  145. delete m_pBitmap;
  146. m_pBitmap = NULL;
  147. }
  148. }
  149. ::GlobalUnlock(m_hBuffer);
  150. }
  151. ::GlobalFree(m_hBuffer);
  152. m_hBuffer = NULL;
  153. }
  154. return false;
  155. }