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

CA认证

开发平台:

Visual C++

  1. // XColorStatic.cpp  Version 1.0
  2. //
  3. // Author:  Hans Dietrich
  4. //          hdietrich2@hotmail.com
  5. //
  6. // This software is released into the public domain.
  7. // You are free to use it in any way you like.
  8. //
  9. // This software is provided "as is" with no expressed
  10. // or implied warranty.  I accept no liability for any
  11. // damage or loss of business that this software may cause.
  12. //
  13. ///////////////////////////////////////////////////////////////////////////////
  14. #include "stdafx.h"
  15. #include "XColorStatic.h"
  16. #include "FontSize.h"
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. ///////////////////////////////////////////////////////////////////////////////
  23. // CXColorStatic
  24. BEGIN_MESSAGE_MAP(CXColorStatic, CStatic)
  25. //{{AFX_MSG_MAP(CXColorStatic)
  26. ON_WM_PAINT()
  27. ON_WM_ERASEBKGND()
  28. //}}AFX_MSG_MAP
  29. END_MESSAGE_MAP()
  30. ///////////////////////////////////////////////////////////////////////////////
  31. // ctor
  32. CXColorStatic::CXColorStatic()
  33. {
  34. m_rgbText       = GetSysColor(COLOR_BTNTEXT);
  35. m_rgbBackground = GetSysColor(COLOR_BTNFACE);
  36. m_pBrush        = new CBrush(m_rgbBackground);
  37. m_bBold         = FALSE;
  38. m_hIcon         = NULL;
  39. m_nXMargin = m_nYMargin = 0;
  40. }
  41. ///////////////////////////////////////////////////////////////////////////////
  42. // dtor
  43. CXColorStatic::~CXColorStatic()
  44. {
  45. TRACE(_T("in CXColorStatic::~CXColorStaticn"));
  46. if (m_font.GetSafeHandle())
  47. m_font.DeleteObject();
  48. if (m_pBrush)
  49. {
  50. m_pBrush->DeleteObject();
  51. delete m_pBrush;
  52. }
  53. m_pBrush = NULL;
  54. }
  55. ///////////////////////////////////////////////////////////////////////////////
  56. // PreSubclassWindow
  57. void CXColorStatic::PreSubclassWindow() 
  58. {
  59. TRACE(_T("in CXColorStatic::PreSubclassWindown"));
  60. // get current font
  61. CFont* pFont = GetFont();
  62. if (!pFont)
  63. {
  64. HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  65. if (hFont == NULL)
  66. hFont = (HFONT) GetStockObject(ANSI_VAR_FONT);
  67. if (hFont)
  68. pFont = CFont::FromHandle(hFont);
  69. }
  70. ASSERT(pFont);
  71. ASSERT(pFont->GetSafeHandle());
  72. // create the font for this control
  73. LOGFONT lf;
  74. pFont->GetLogFont(&lf);
  75. m_font.CreateFontIndirect(&lf);
  76. }
  77. ///////////////////////////////////////////////////////////////////////////////
  78. // OnPaint
  79. void CXColorStatic::OnPaint() 
  80. {
  81. CPaintDC dc(this); // device context for painting
  82. dc.SaveDC();
  83. dc.SetTextColor(m_rgbText);
  84. dc.SetBkColor(m_rgbBackground);
  85. dc.SetBkMode(OPAQUE);
  86. dc.SelectObject(m_pBrush);
  87. CRect rect;
  88. GetClientRect(rect); 
  89. // cannot have both an icon and text
  90. if (m_hIcon)
  91. {
  92. int nIconX = ::GetSystemMetrics(SM_CXICON);
  93. int nIconY = ::GetSystemMetrics(SM_CYICON);
  94. rect.left = rect.left + (rect.Width() - nIconX) / 2;
  95. rect.top = rect.top + (rect.Height() - nIconY) / 2;
  96. dc.DrawIcon(rect.left, rect.top, m_hIcon);
  97. }
  98. else
  99. {
  100. dc.SelectObject(&m_font);
  101. // get static's text
  102. CString strText = _T("");
  103. GetWindowText(strText);
  104. UINT nFormat = 0;
  105. DWORD dwStyle = GetStyle();
  106. // set DrawText format from static style settings
  107. if (dwStyle & SS_CENTER)
  108. nFormat |= DT_CENTER;
  109. else if (dwStyle & SS_LEFT)
  110. nFormat |= DT_LEFT;
  111. else if (dwStyle & SS_RIGHT)
  112. nFormat |= DT_RIGHT;
  113. if (dwStyle & SS_CENTERIMAGE) // vertical centering ==> single line only
  114. nFormat |= DT_VCENTER | DT_SINGLELINE;
  115. else
  116. nFormat |= DT_WORDBREAK;
  117. rect.left += m_nXMargin;
  118. rect.top  += m_nYMargin;
  119. dc.DrawText(strText, rect, nFormat);
  120. }
  121. dc.RestoreDC(-1);
  122. }
  123. ///////////////////////////////////////////////////////////////////////////////
  124. // OnEraseBkgnd
  125. BOOL CXColorStatic::OnEraseBkgnd(CDC* pDC) 
  126. {
  127. CRect cr;
  128. GetClientRect(cr); 
  129. pDC->FillRect(&cr, m_pBrush);
  130. return TRUE; //CStatic::OnEraseBkgnd(pDC);
  131. }
  132. ///////////////////////////////////////////////////////////////////////////////
  133. // SetFont
  134. void CXColorStatic::SetFont(LOGFONT *pLogFont, BOOL bRedraw /*= TRUE*/)
  135. {
  136. ASSERT(pLogFont);
  137. if (!pLogFont)
  138. return;
  139. if (m_font.GetSafeHandle())
  140. m_font.DeleteObject();
  141. LOGFONT lf = *pLogFont;
  142. lf.lfWeight = m_bBold ? FW_BOLD : FW_NORMAL;
  143. m_font.CreateFontIndirect(&lf);
  144. if (bRedraw)
  145. RedrawWindow();
  146. }
  147. ///////////////////////////////////////////////////////////////////////////////
  148. // SetFont
  149. void CXColorStatic::SetFont(LPCTSTR lpszFaceName, 
  150. int nPointSize, 
  151. BOOL bRedraw /*= TRUE*/)
  152. {
  153. // null face name is ok - we will use current font
  154. LOGFONT lf;
  155. memset(&lf, 0, sizeof(lf));
  156. if (lpszFaceName == NULL)
  157. {
  158. CFont *pFont = GetFont();
  159. ASSERT(pFont);
  160. pFont->GetLogFont(&lf);
  161. }
  162. else
  163. {
  164. _tcsncpy(lf.lfFaceName, lpszFaceName, sizeof(lf.lfFaceName)/sizeof(TCHAR)-1);
  165. }
  166. lf.lfHeight = GetFontHeight(nPointSize);
  167. SetFont(&lf, bRedraw);
  168. }
  169. ///////////////////////////////////////////////////////////////////////////////
  170. // SetFont
  171. void CXColorStatic::SetFont(CFont *pFont, BOOL bRedraw /*= TRUE*/)
  172. {
  173. ASSERT(pFont);
  174. if (!pFont)
  175. return;
  176. LOGFONT lf;
  177. memset(&lf, 0, sizeof(lf));
  178. pFont->GetLogFont(&lf);
  179. SetFont(&lf, bRedraw);
  180. }
  181. ///////////////////////////////////////////////////////////////////////////////
  182. // SetTextColor
  183. void CXColorStatic::SetTextColor(COLORREF rgb, BOOL bRedraw /*= TRUE*/) 
  184. m_rgbText = rgb; 
  185. if (bRedraw)
  186. RedrawWindow();
  187. }
  188. ///////////////////////////////////////////////////////////////////////////////
  189. // SetBold
  190. void CXColorStatic::SetBold(BOOL bFlag, BOOL bRedraw /*= TRUE*/)
  191. m_bBold = bFlag;
  192. LOGFONT lf;
  193. memset(&lf, 0, sizeof(lf));
  194. CFont *pFont = GetFont();
  195. ASSERT(pFont);
  196. pFont->GetLogFont(&lf);
  197. lf.lfWeight = m_bBold ? FW_BOLD : FW_NORMAL;
  198. SetFont(&lf, bRedraw);
  199. }
  200. ///////////////////////////////////////////////////////////////////////////////
  201. // SetBackgroundColor
  202. void CXColorStatic::SetBackgroundColor(COLORREF rgb, BOOL bRedraw /*= TRUE*/) 
  203. m_rgbBackground = rgb; 
  204. if (m_pBrush)
  205. {
  206. m_pBrush->DeleteObject();
  207. delete m_pBrush;
  208. }
  209. m_pBrush = new CBrush(m_rgbBackground);
  210. if (bRedraw)
  211. RedrawWindow();
  212. }
  213. ///////////////////////////////////////////////////////////////////////////////
  214. // SetIcon
  215. void CXColorStatic::SetIcon(HICON hIcon, BOOL bRedraw /*= TRUE*/)
  216. {
  217. ASSERT(hIcon);
  218. m_hIcon = hIcon;
  219. if (bRedraw)
  220. RedrawWindow();
  221. }