EnBitmap.cpp
上传用户:vipseo
上传日期:2010-02-15
资源大小:137k
文件大小:4k
源码类别:

组合框控件

开发平台:

Visual C++

  1. // EnBitmap.cpp: implementation of the CEnBitmap class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "EnBitmap.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. const int HIMETRIC_INCH = 2540;
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CEnBitmap::CEnBitmap()
  16. {
  17. }
  18. CEnBitmap::~CEnBitmap()
  19. {
  20. }
  21. BOOL CEnBitmap::LoadImage(UINT uIDRes, LPCTSTR szResourceType, HMODULE hInst, COLORREF crBack)
  22. {
  23. ASSERT(m_hObject == NULL);      // only attach once, detach on destroy
  24. if (m_hObject != NULL)
  25. return FALSE;
  26. BYTE* pBuff = NULL;
  27. int nSize = 0;
  28. BOOL bResult = FALSE;
  29. // first call is to get buffer size
  30. if (GetResource(MAKEINTRESOURCE(uIDRes), szResourceType, hInst, 0, nSize))
  31. {
  32. if (nSize > 0)
  33. {
  34. pBuff = new BYTE[nSize];
  35. // this loads it
  36. if (GetResource(MAKEINTRESOURCE(uIDRes), szResourceType, hInst, pBuff, nSize))
  37. {
  38. IPicture* pPicture = LoadFromBuffer(pBuff, nSize);
  39. if (pPicture)
  40. {
  41. bResult = Attach(pPicture, crBack);
  42. pPicture->Release();
  43. }
  44. }
  45. delete [] pBuff;
  46. }
  47. }
  48. return bResult;
  49. }
  50. BOOL CEnBitmap::LoadImage(LPCTSTR szImagePath, COLORREF crBack)
  51. {
  52. ASSERT(m_hObject == NULL);      // only attach once, detach on destroy
  53. if (m_hObject != NULL)
  54. return FALSE;
  55. BOOL bResult = FALSE;
  56. CFile cFile;
  57. CFileException e;
  58. if (cFile.Open(szImagePath, CFile::modeRead | CFile::typeBinary, &e))
  59. {
  60. int nSize = cFile.GetLength();
  61. BYTE* pBuff = new BYTE[nSize];
  62. if (cFile.Read(pBuff, nSize) > 0)
  63. {
  64. IPicture* pPicture = LoadFromBuffer(pBuff, nSize);
  65. if (pPicture)
  66. {
  67. bResult = Attach(pPicture, crBack);
  68. pPicture->Release();
  69. }
  70. }
  71. delete [] pBuff;
  72. }
  73. return bResult;
  74. }
  75. IPicture* CEnBitmap::LoadFromBuffer(BYTE* pBuff, int nSize)
  76. {
  77. bool bResult = false;
  78. HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize);
  79. void* pData = GlobalLock(hGlobal);
  80. memcpy(pData, pBuff, nSize);
  81. GlobalUnlock(hGlobal);
  82. IStream* pStream = NULL;
  83. IPicture* pPicture = NULL;
  84. if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK)
  85. {
  86. HRESULT hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&pPicture);
  87. pStream->Release();
  88. }
  89. return pPicture; // caller releases
  90. }
  91. BOOL CEnBitmap::GetResource(LPCTSTR lpName, LPCTSTR lpType, HMODULE hInst, void* pResource, int& nBufSize)
  92. HRSRC hResInfo;
  93. HANDLE hRes;
  94. LPSTR lpRes = NULL; 
  95. int nLen = 0;
  96. bool bResult = FALSE;
  97. // Find the resource
  98. hResInfo = FindResource(hInst, lpName, lpType);
  99. if (hResInfo == NULL) 
  100. return false;
  101. // Load the resource
  102. hRes = LoadResource(hInst, hResInfo);
  103. if (hRes == NULL) 
  104. return false;
  105. // Lock the resource
  106. lpRes = (char*)LockResource(hRes);
  107. if (lpRes != NULL)
  108. if (pResource == NULL)
  109. {
  110. nBufSize = SizeofResource(hInst, hResInfo);
  111. bResult = true;
  112. }
  113. else
  114. {
  115. if (nBufSize >= (int)SizeofResource(hInst, hResInfo))
  116. {
  117. memcpy(pResource, lpRes, nBufSize);
  118. bResult = true;
  119. }
  120. UnlockResource(hRes);  
  121. }
  122. // Free the resource
  123. FreeResource(hRes);
  124. return bResult;
  125. }
  126. BOOL CEnBitmap::Attach(IPicture* pPicture, COLORREF crBack)
  127. {
  128. ASSERT(m_hObject == NULL);      // only attach once, detach on destroy
  129. if (m_hObject != NULL)
  130. return FALSE;
  131. ASSERT(pPicture);
  132. if (!pPicture)
  133. return FALSE;
  134. BOOL bResult = FALSE;
  135. CDC dcMem;
  136. CDC* pDC = CWnd::GetDesktopWindow()->GetDC();
  137. if (dcMem.CreateCompatibleDC(pDC))
  138. {
  139. long hmWidth;
  140. long hmHeight;
  141. pPicture->get_Width(&hmWidth);
  142. pPicture->get_Height(&hmHeight);
  143. int nWidth = MulDiv(hmWidth, pDC->GetDeviceCaps(LOGPIXELSX), HIMETRIC_INCH);
  144. int nHeight = MulDiv(hmHeight, pDC->GetDeviceCaps(LOGPIXELSY), HIMETRIC_INCH);
  145. CBitmap bmMem;
  146. if (bmMem.CreateCompatibleBitmap(pDC, nWidth, nHeight))
  147. {
  148. CBitmap* pOldBM = dcMem.SelectObject(&bmMem);
  149. if (crBack != -1)
  150. dcMem.FillSolidRect(0, 0, nWidth, nHeight, crBack);
  151. HRESULT hr = pPicture->Render(dcMem, 0, 0, nWidth, nHeight, 0, hmHeight, hmWidth, -hmHeight, NULL);
  152. dcMem.SelectObject(pOldBM);
  153. if (hr == S_OK)
  154. bResult = CBitmap::Attach(bmMem.Detach());
  155. }
  156. }
  157. CWnd::GetDesktopWindow()->ReleaseDC(pDC);
  158. return bResult;
  159. }