PrefsStatic.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:5k
源码类别:

CA认证

开发平台:

Visual C++

  1. // PrefsStatic.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PrefsStatic.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CPrefsStatic
  12. CPrefsStatic::CPrefsStatic()
  13. {
  14. m_textClr = ::GetSysColor (COLOR_3DFACE);
  15. m_fontWeight = FW_NORMAL;
  16. m_fontSize = 12;
  17. }
  18. CPrefsStatic::~CPrefsStatic()
  19. {
  20. if (m_bm.GetSafeHandle())
  21. {
  22. m_bm.DeleteObject();
  23. }
  24. if (m_captionFont.GetSafeHandle())
  25. {
  26. m_captionFont.DeleteObject();
  27. }
  28. if (m_nameFont.GetSafeHandle())
  29. {
  30. m_nameFont.DeleteObject();
  31. }
  32. }
  33. BEGIN_MESSAGE_MAP(CPrefsStatic, CStatic)
  34. //{{AFX_MSG_MAP(CPrefsStatic)
  35. ON_WM_PAINT()
  36. ON_WM_ERASEBKGND()
  37. ON_MESSAGE( WM_SETTEXT, OnSetText )
  38. //}}AFX_MSG_MAP
  39. END_MESSAGE_MAP()
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CPrefsStatic message handlers
  42. void CPrefsStatic::OnPaint() 
  43. {
  44. CPaintDC dc(this); // device context for painting
  45. CFont *pOldFont = NULL;
  46. // Set default font
  47. if (m_csFontName=="")
  48. {
  49. CWnd *pWndParent = GetParent();
  50. if (pWndParent)
  51. {
  52. dc.SelectObject (pWndParent->GetFont());
  53. }
  54. }
  55. else
  56. {
  57. // create a font, if we need to
  58. if (m_captionFont.GetSafeHandle()==NULL)
  59. {
  60. m_captionFont.CreateFont( m_fontSize, 
  61. 0, 0, 0, 
  62. m_fontWeight,
  63. 0, 0, 0, ANSI_CHARSET,
  64. OUT_DEFAULT_PRECIS,
  65. CLIP_DEFAULT_PRECIS,
  66. DEFAULT_QUALITY,
  67. FF_MODERN,
  68. m_csFontName);
  69. }
  70. if (m_captionFont.GetSafeHandle()!=NULL)
  71. pOldFont = dc.SelectObject(&m_captionFont);
  72. }
  73. // Draw text
  74. CString strText;
  75. GetWindowText(strText);
  76. dc.SetTextColor(m_textClr);
  77. dc.SetBkMode(TRANSPARENT);
  78. // vertical center
  79. CRect cr;
  80. GetClientRect(cr); 
  81. cr.left+=5;
  82. dc.DrawText( strText, cr, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
  83. if (pOldFont)
  84. dc.SelectObject(pOldFont);
  85. }
  86. BOOL CPrefsStatic::OnEraseBkgnd(CDC* pDC) 
  87. {
  88. if (!m_bm.GetSafeHandle())
  89. {
  90. MakeCaptionBitmap();
  91. }
  92. if (m_bm.GetSafeHandle())
  93. {
  94. CRect cr;
  95. GetClientRect(cr);
  96. CDC memDC;
  97. memDC.CreateCompatibleDC(pDC);
  98. CBitmap *pOB = memDC.SelectObject(&m_bm);
  99. pDC->BitBlt(0,0,cr.Width(), cr.Height(), &memDC, 0,0, SRCCOPY);
  100. memDC.SelectObject(pOB);
  101. }
  102. return TRUE;
  103. }
  104. BOOL CPrefsStatic::OnSetText(WPARAM wParam, LPARAM lParam)
  105. {
  106. DefWindowProc (WM_SETTEXT, wParam, lParam);
  107. Invalidate(TRUE);
  108. return (TRUE);
  109. }
  110. //////////////////
  111. // Helper to paint rectangle with a color.
  112. //
  113. static void PaintRect(CDC& dc, int x, int y, int w, int h, COLORREF color)
  114. {
  115. CBrush brush(color);
  116. CBrush* pOldBrush = dc.SelectObject(&brush);
  117. dc.PatBlt(x, y, w, h, PATCOPY);
  118. dc.SelectObject(pOldBrush);
  119. }
  120. void CPrefsStatic::MakeCaptionBitmap()
  121. {
  122. if (m_bm.m_hObject)
  123. return;    // already have bitmap; return
  124. CRect cr;
  125. GetClientRect(cr);
  126. int w = cr.Width();
  127. int h = cr.Height();
  128. // Create bitmap same size as caption area and select into memory DC
  129. //
  130. CWindowDC dcWin(this);
  131. CDC dc;
  132. dc.CreateCompatibleDC(&dcWin);
  133. m_bm.DeleteObject();
  134. m_bm.CreateCompatibleBitmap(&dcWin, w, h);
  135. CBitmap* pOldBitmap = dc.SelectObject(&m_bm);
  136. COLORREF clrBG = ::GetSysColor(COLOR_3DFACE); // background color
  137. int r = GetRValue(clrBG); // red..
  138. int g = GetGValue(clrBG); // ..green
  139. int b = GetBValue(clrBG); // ..blue color vals
  140. int x = 8*cr.right/8; // start 5/6 of the way right
  141. int w1 = x - cr.left; // width of area to shade
  142. int NCOLORSHADES = 128; // this many shades in gradient
  143. int xDelta= max( w / NCOLORSHADES , 1); // width of one shade band
  144. PaintRect(dc, x, 0, cr.right-x, h, clrBG);
  145. while (x > xDelta) 
  146. { // paint bands right to left
  147. x -= xDelta; // next band
  148. int wmx2 = (w1-x)*(w1-x); // w minus x squared
  149. int w2  = w1*w1; // w squared
  150. PaintRect(dc, x, 0, xDelta, h,
  151. RGB(r-(r*wmx2)/w2, g-(g*wmx2)/w2, b-(b*wmx2)/w2));
  152. }
  153. PaintRect(dc,0,0,x,h,RGB(0,0,0));  // whatever's left ==> black
  154. // draw the 'constant' text
  155. // create a font, if we need to
  156. if (m_nameFont.GetSafeHandle()==NULL)
  157. {
  158. m_nameFont.CreateFont( 18, 0, 0, 0, FW_BOLD,
  159. 0, 0, 0, ANSI_CHARSET,
  160. OUT_DEFAULT_PRECIS,
  161. CLIP_DEFAULT_PRECIS,
  162. DEFAULT_QUALITY,
  163. FF_MODERN,
  164. m_csFontName);
  165. }
  166. CFont * OldFont = dc.SelectObject(&m_nameFont);
  167. // back up a little
  168. cr.right-=5;
  169. // draw text in DC
  170. dc.SetBkMode(TRANSPARENT);
  171. dc.SetTextColor( ::GetSysColor( COLOR_3DHILIGHT));
  172. dc.DrawText( m_csConstantText, cr + CPoint(1,1), DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
  173. dc.SetTextColor( ::GetSysColor( COLOR_3DSHADOW));
  174. dc.DrawText( m_csConstantText, cr, DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
  175. // restore old font
  176. dc.SelectObject(OldFont);
  177. // Restore DC
  178. dc.SelectObject(pOldBitmap);
  179. }