DIBStatic.cpp
上传用户:zch19780
上传日期:2007-01-02
资源大小:8k
文件大小:4k
源码类别:

Static控件

开发平台:

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* pBrushWhite;
  71.   pBrushWhite = CBrush::FromHandle((HBRUSH)::GetStockObject(WHITE_BRUSH));
  72.     
  73. dc.FillRect(&rectPaint, pBrushWhite);
  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. dc.MoveTo(PaintRect.TopLeft());
  117. dc.LineTo(PaintRect.BottomRight());
  118. dc.MoveTo(PaintRect.right, PaintRect.top);
  119. dc.LineTo(PaintRect.left, PaintRect.bottom);
  120. }
  121. return;
  122. }
  123. void CDIBStatic::UpdateDib()
  124. {
  125. ASSERT_VALID(this);
  126. PaintDib(IsValidDib());
  127. }
  128. /////////////////////////////////////////////////////////////////////////////
  129. // CDIBStatic message handlers
  130. HBRUSH CDIBStatic::CtlColor(CDC* pDC, UINT nCtlColor) 
  131. {
  132. UpdateDib();
  133. // TODO: Return a non-NULL brush if the parent's handler should not be called
  134. return (HBRUSH)GetStockObject(NULL_BRUSH);
  135. }
  136. BOOL CDIBStatic::OnQueryNewPalette() 
  137. {
  138. return DoRealizePalette(FALSE);
  139. }
  140. void CDIBStatic::OnPaletteChanged(CWnd* pFocusWnd) 
  141. {
  142. DoRealizePalette(TRUE);
  143. }
  144. BOOL CDIBStatic::DoRealizePalette(BOOL bForceBackGround)
  145. {
  146. if (IsValidDib())
  147. {
  148. CClientDC dc(this);
  149. if (!m_DIB.m_pPalette)
  150. return FALSE;
  151. HPALETTE hPal = (HPALETTE)m_DIB.m_pPalette->m_hObject;
  152. HPALETTE hOldPalette = SelectPalette(dc, hPal, bForceBackGround);
  153. UINT nChanged = dc.RealizePalette();
  154. SelectPalette(dc, hOldPalette, TRUE);
  155. if (nChanged == 0) // no change to our mapping
  156. return FALSE;
  157. // some changes have been made; invalidate
  158. UpdateDib();
  159. }
  160. return TRUE;
  161. }