Dib.cpp
上传用户:zhoushen
上传日期:2022-06-15
资源大小:84k
文件大小:4k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. //////////////////////////////////
  2. // Device independent bitmap manager
  3. //
  4. #include "StdAfx.h"
  5. #include "Dib.h"
  6.  
  7. #ifdef _MSC_VER
  8. #pragma comment( lib, "vfw32.lib")
  9. #endif
  10. IMPLEMENT_DYNAMIC(CDib, CBitmap)
  11. CDib::CDib()
  12. {
  13. m_pbmih = NULL;
  14. m_hdd = NULL;
  15. }
  16. CDib::~CDib()
  17. {
  18. DeleteObject();
  19. }
  20. void CDib::DeleteObject()
  21. {
  22. if (m_hdd)
  23. {
  24. DrawDibClose(m_hdd);
  25. m_hdd = NULL;
  26. }
  27. if (m_pbmih)
  28. {
  29. delete [] (char*)m_pbmih;
  30. m_pbmih = NULL;
  31. }
  32. }
  33. UINT CDib::GetNumPaletteColors()
  34. {
  35. // Calculate # entries in color table:
  36. // if biClrUsed is not specified, then use:
  37. // (2,16,256) for (1,4,8)-bit bitmaps;
  38. // 0 for 24, 32-bit bitmaps (no color table)
  39. UINT nColors=m_pbmih->biClrUsed;
  40. if (nColors==0 && m_pbmih->biBitCount<=8)
  41. nColors = 1<<m_pbmih->biBitCount;
  42. return nColors;
  43. }
  44. LPBYTE CDib::GetBits()
  45. {
  46. return (LPBYTE)m_pbmih + m_pbmih->biSize + GetNumPaletteColors()*sizeof(RGBQUAD);
  47. }
  48. const BITMAP_TYPE = (WORD)('M' << 8) | 'B';
  49. BOOL CDib::Load(LPCTSTR szPathName)
  50. {
  51. if( m_hObject )
  52. Detach();
  53. if( Attach(::LoadImage(NULL, szPathName,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE)) )
  54. {
  55. CFile file;
  56. BOOL bRet = FALSE;
  57. file.Open( szPathName, CFile::modeRead );
  58. if( Load( file )==TRUE )
  59. bRet = CreatePalette();
  60. file.Close();
  61. return bRet;
  62. }
  63. return FALSE;
  64. }
  65. /*BOOL CDib::Load(UINT imageID)
  66. {
  67. if( m_hObject )
  68. Detach();
  69. MAKEINTRESOURCE
  70. if( Attach(::LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(imageID), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE)) )
  71. {
  72. CFile file;
  73. BOOL bRet = FALSE;
  74. file.Open( szPathName, CFile::modeRead );
  75. if( Load( file )==TRUE )
  76. bRet = CreatePalette();
  77. file.Close();
  78. return bRet;
  79. }
  80. return FALSE;
  81. }*/
  82. BOOL CDib::Load(CFile &file)
  83. {
  84. BITMAPFILEHEADER hdr;
  85. DWORD len = file.Read(&hdr, sizeof(hdr));
  86. if ((len!=sizeof(hdr)) || (hdr.bfType!=BITMAP_TYPE))
  87. {
  88. TRACE0("***CDib: bad BITMAPFILEHEADERn");
  89. return FALSE;
  90. }
  91. len = file.GetLength() - len;
  92. m_pbmih = (BITMAPINFOHEADER*)new char[len];
  93. file.Read(m_pbmih, len);
  94. return TRUE;
  95. }
  96. BOOL CDib::Draw(CDC& dc, const CRect* rcDst, const CRect* rcSrc)
  97. {
  98. if (!m_pbmih)
  99. return FALSE;
  100. if (!m_hdd)
  101. VERIFY(m_hdd = DrawDibOpen());
  102. CRect rc;
  103. if (!rcSrc)
  104. {
  105. // if no source rect, use whole bitmap
  106. rc.SetRect(0, 0, m_pbmih->biWidth, m_pbmih->biHeight);
  107. rcSrc=&rc;
  108. }
  109. if (!rcDst)
  110. {
  111. // if no destination rect, use source
  112. rcDst=rcSrc;
  113. }
  114. // This is as easy as it gets in Windows.
  115. return DrawDibDraw(m_hdd, dc, rcDst->left, rcDst->top, rcDst->Width(), rcDst->Height(), m_pbmih, GetBits(), rcSrc->left, rcSrc->top, rcSrc->Width(), rcSrc->Height(), 0);
  116. }
  117. BOOL CDib::Draw(CDC *pDC) 
  118. {
  119. if( m_hObject )
  120. {
  121. CPalette* pOldPal = pDC->SelectPalette(CPalette::FromHandle(m_pal),FALSE);
  122. pDC->RealizePalette();
  123. BOOL bRet = DrawBitmap(*pDC, this); // as before
  124. pDC->SelectPalette(pOldPal, TRUE);
  125. return bRet;
  126. }
  127. return FALSE;
  128. }
  129. BOOL CDib::CreatePalette()
  130. {
  131. int i = 0;
  132. int nColors = GetNumPaletteColors();
  133. CDC *pDC = CDC::FromHandle( GetDC(AfxGetApp()->m_pMainWnd->GetSafeHwnd()) );
  134. CDC mdc; // memory DC
  135. RGBQUAD *pRgbQuad = NULL;
  136. LPLOGPALETTE lpPal;
  137. HANDLE              hLogPal;
  138. CBitmap* pOld = NULL;
  139. pRgbQuad = new RGBQUAD[nColors];
  140. mdc.CreateCompatibleDC(pDC);
  141. pOld = mdc.SelectObject(this);
  142. GetDIBColorTable( mdc.GetSafeHdc(), 0, nColors, pRgbQuad );
  143. if( nColors )
  144. {
  145. hLogPal = GlobalAlloc (GHND, sizeof (LOGPALETTE) +
  146.  sizeof (PALETTEENTRY) * nColors);
  147. lpPal = (LPLOGPALETTE) GlobalLock (hLogPal);
  148. lpPal->palVersion    = 0x300;
  149. lpPal->palNumEntries = nColors;
  150. for (i = 0;  i < nColors;  i++)
  151. {
  152. lpPal->palPalEntry[i].peRed   = pRgbQuad[i].rgbRed;
  153. lpPal->palPalEntry[i].peGreen = pRgbQuad[i].rgbGreen;
  154. lpPal->palPalEntry[i].peBlue  = pRgbQuad[i].rgbBlue;
  155. lpPal->palPalEntry[i].peFlags = 0;
  156. }
  157. m_pal = ::CreatePalette( lpPal );
  158. GlobalUnlock(hLogPal);
  159. GlobalFree(hLogPal);
  160. }
  161. delete []pRgbQuad;
  162. ReleaseDC( AfxGetApp()->m_pMainWnd->GetSafeHwnd(), pDC->GetSafeHdc() );
  163. return TRUE;
  164. }
  165. BOOL DrawBitmap(CDC& dc, CBitmap* pbm)
  166. {
  167. CDC mdc; // memory DC
  168. BITMAP bm;
  169. mdc.CreateCompatibleDC(&dc);
  170. CBitmap* pOld = mdc.SelectObject(pbm);
  171. pbm->GetObject(sizeof(bm), &bm);
  172. BOOL bRet = dc.BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, &mdc, 0, 0, SRCCOPY);
  173. mdc.SelectObject(pOld);
  174. return bRet;
  175. }