DIBStatic.cpp
上传用户:alisonmail
上传日期:2013-02-28
资源大小:500k
文件大小:4k
源码类别:

图片显示

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Copyright (C) 1998 by Jorge Lodos
  3. // All rights reserved
  4. //
  5. // Distribute and use freely, except:
  6. // 1. Don't alter or remove this notice.
  7. // 2. Mark the changes you made
  8. //
  9. // Send bug reports, bug fixes, enhancements, requests, etc. to:
  10. //    lodos@cigb.edu.cu
  11. /////////////////////////////////////////////////////////////////////////////
  12. // DIBStatic.cpp : implementation file
  13. //
  14. #include "stdafx.h"
  15. #include "Dib.h"
  16. #include "DIBStatic.h"
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CDIBStatic
  24. CDIBStatic::CDIBStatic()
  25. {
  26. }
  27. CDIBStatic::~CDIBStatic()
  28. {
  29. }
  30. BEGIN_MESSAGE_MAP(CDIBStatic, CStatic)
  31. //{{AFX_MSG_MAP(CDIBStatic)
  32. ON_WM_CTLCOLOR_REFLECT()
  33. ON_WM_QUERYNEWPALETTE()
  34. ON_WM_PALETTECHANGED()
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. BOOL CDIBStatic::LoadDib(LPCTSTR lpszFileName)
  38. {
  39. try
  40. {
  41. CFile file(lpszFileName, CFile::modeRead);
  42. return LoadDib(file);
  43. }
  44. catch (CFileException* e)
  45. {
  46. e->Delete();
  47. return FALSE;
  48. }
  49. }
  50. BOOL CDIBStatic::LoadDib(CFile& file)
  51. {
  52. ASSERT_VALID(this);
  53.     
  54. BOOL bResult = TRUE;
  55. if (!m_DIB.Read(file))
  56. bResult = FALSE;
  57. DoRealizePalette(FALSE);
  58. UpdateDib();
  59. return bResult;
  60. }
  61. void CDIBStatic::ClearDib()
  62. {
  63. ASSERT_VALID(this);
  64. CClientDC dc(this);
  65. CRect rectPaint;
  66.     
  67. GetClientRect(&rectPaint);    
  68. rectPaint.InflateRect(-1,-1);
  69.     
  70. CBrush brush;
  71. brush.CreateSolidBrush(RGB(0,128,128));
  72.     
  73. dc.FillRect(&rectPaint, &brush);
  74. }
  75. void CDIBStatic::PaintDib(BOOL bDibValid)
  76. {
  77. ASSERT_VALID(this);
  78. ClearDib();
  79. CRect PaintRect;
  80. GetClientRect(&PaintRect);    
  81. PaintRect.InflateRect(-1, -1);
  82. CClientDC dc(this);
  83. if (bDibValid)
  84. {
  85. int nDestX, nDestY, nDestWidth, nDestHeight;
  86. if (m_DIB.Width() < (DWORD)PaintRect.Width() && m_DIB.Height() < (DWORD)PaintRect.Height())
  87. { // If the image fits, just center it
  88. nDestX = PaintRect.left + (PaintRect.Width() - m_DIB.Width())/2;
  89. nDestY = PaintRect.top + (PaintRect.Height() - m_DIB.Height())/2;
  90. nDestWidth = m_DIB.Height();
  91. nDestHeight = m_DIB.Width();
  92. }
  93. else
  94. { // The bitmap doesn't fit, scale to fit 
  95. if ((PaintRect.Width()/(float)m_DIB.Width()) <= (PaintRect.Height()/(float)m_DIB.Height()))
  96. { // Width is constraint
  97. nDestWidth = PaintRect.Width();
  98. nDestHeight = (nDestWidth*m_DIB.Height()) / m_DIB.Width();
  99. nDestX = PaintRect.left;
  100. nDestY = PaintRect.top + (PaintRect.Height() - nDestHeight) /2;
  101. }
  102. else
  103. { // Height is constraint
  104. nDestHeight = PaintRect.Height();
  105. nDestWidth = (nDestHeight*m_DIB.Width()) / m_DIB.Height();
  106. nDestX = PaintRect.left + (PaintRect.Width() - nDestWidth) /2;
  107. nDestY = PaintRect.top;
  108. }
  109. }
  110. CRect RectDest(nDestX, nDestY, nDestX+nDestWidth, nDestY+nDestHeight);
  111. CRect RectDib(0, 0, m_DIB.Width(), m_DIB.Height());
  112. m_DIB.Paint(dc, &RectDest, &RectDib);     
  113. }
  114. else
  115. {
  116. UINT oldTextAlign = dc.SetTextAlign(TA_CENTER|TA_BASELINE);
  117. dc.SetBkMode(TRANSPARENT);
  118. dc.TextOut((PaintRect.left+PaintRect.right)/2, 
  119. (PaintRect.top+PaintRect.bottom)/2, "No Picture");
  120. dc.SetTextAlign(oldTextAlign);
  121. }
  122. return;
  123. }
  124. void CDIBStatic::UpdateDib()
  125. {
  126. ASSERT_VALID(this);
  127. PaintDib(IsValidDib());
  128. }
  129. /////////////////////////////////////////////////////////////////////////////
  130. // CDIBStatic message handlers
  131. HBRUSH CDIBStatic::CtlColor(CDC* pDC, UINT nCtlColor) 
  132. {
  133. UpdateDib();
  134. // TODO: Return a non-NULL brush if the parent's handler should not be called
  135. return (HBRUSH)GetStockObject(NULL_BRUSH);
  136. }
  137. BOOL CDIBStatic::OnQueryNewPalette() 
  138. {
  139. return DoRealizePalette(FALSE);
  140. }
  141. void CDIBStatic::OnPaletteChanged(CWnd* pFocusWnd) 
  142. {
  143. DoRealizePalette(TRUE);
  144. }
  145. BOOL CDIBStatic::DoRealizePalette(BOOL bForceBackGround)
  146. {
  147. if (IsValidDib())
  148. {
  149. CClientDC dc(this);
  150. if (!m_DIB.m_pPalette)
  151. return FALSE;
  152. HPALETTE hPal = (HPALETTE)m_DIB.m_pPalette->m_hObject;
  153. HPALETTE hOldPalette = SelectPalette(dc, hPal, bForceBackGround);
  154. UINT nChanged = dc.RealizePalette();
  155. SelectPalette(dc, hOldPalette, TRUE);
  156. if (nChanged == 0) // no change to our mapping
  157. return FALSE;
  158. // some changes have been made; invalidate
  159. UpdateDib();
  160. }
  161. return TRUE;
  162. }