#include "stdafx.h" #include "XColorStatic.h" #include "FontSize.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /***************************************************************************************/ // CXColorStatic BEGIN_MESSAGE_MAP(CXColorStatic, CStatic) // {{ AFX_MSG_MAP ON_WM_PAINT() ON_WM_ERASEBKGND() // }} AFX_MSG_MAP END_MESSAGE_MAP() /***************************************************************************************/ // CXColorStatic CXColorStatic::CXColorStatic() { m_rgbText = GetSysColor(COLOR_BTNTEXT); m_rgbBackground = GetSysColor(COLOR_BTNFACE); m_pBrush = new CBrush(m_rgbBackground); m_bBold = FALSE; m_hIcon = NULL; m_iXMargin = 0; m_iYMargin = 0; } /***************************************************************************************/ // ~CXColorStatic CXColorStatic::~CXColorStatic() { TRACE(_T("in CXColorStatic::!CXColorStatic\n")); if(m_font.GetSafeHandle()) m_font.DeleteObject(); if(m_pBrush) { m_pBrush->DeleteObject(); delete m_pBrush; } m_pBrush = NULL; } /***************************************************************************************/ // PreSubclassWindow void CXColorStatic::PreSubclassWindow() { TRACE(_T("in CXColorStatic::PreSubclassWindow\n")); // 获取字体 CFont* pFont = GetFont(); if(!pFont) { HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); if(hFont == NULL) hFont = (HFONT)GetStockObject(ANSI_VAR_FONT); if(hFont) pFont = CFont::FromHandle(hFont); } ASSERT(pFont); ASSERT(pFont->GetSafeHandle()); // 为这个控件创建一个字体 LOGFONT lf; pFont->GetLogFont(&lf); m_font.CreateFontIndirect(&lf); } /***************************************************************************************/ // OnPaint void CXColorStatic::OnPaint() { CPaintDC dc(this); // 获取到绘制对象的设备上下文 dc.SaveDC(); dc.SetTextColor(m_rgbText); dc.SetBkColor(m_rgbBackground); dc.SetBkMode(OPAQUE); dc.SelectObject(m_pBrush); CRect rect; GetClientRect(rect); // 不能同时绘制图标和文本 if(m_hIcon) { int iIconX = GetSystemMetrics(SM_CXICON); int iIconY = GetSystemMetrics(SM_CYICON); rect.left = rect.left + (rect.Width() - iIconX) / 2; rect.top = rect.top + (rect.Height() - iIconY) / 2; dc.DrawIcon(rect.left, rect.top, m_hIcon); } else { dc.SelectObject(&m_font); // 获取静态文本 CString strText = _T(""); GetWindowText(strText); UINT uiFormat = 0; DWORD dwStyle = GetStyle(); // 重新绘制静态文本 if(dwStyle && SS_CENTER) uiFormat |= DT_CENTER; else if(dwStyle && SS_LEFT) uiFormat |= DT_LEFT; else if(dwStyle && SS_RIGHT) uiFormat |= DT_RIGHT; if(dwStyle & SS_CENTERIMAGE) // 垂直居中 ==> 仅对单行 uiFormat |= DT_VCENTER | DT_SINGLELINE; else uiFormat |= DT_WORDBREAK; uiFormat = DT_LEFT; rect.left += m_iXMargin; rect.top += m_iYMargin; dc.DrawText(strText, rect, uiFormat); } dc.RestoreDC(-1); } /***************************************************************************************/ // OnEraseBkgnd BOOL CXColorStatic::OnEraseBkgnd(CDC *pDC) { CRect cr; GetClientRect(cr); pDC->FillRect(&cr, m_pBrush); return TRUE; } /***************************************************************************************/ // SetFont void CXColorStatic::SetFont(LOGFONT *pLogFont, BOOL bRedraw /* = TRUE */) { ASSERT(pLogFont); if(!pLogFont) return; if(m_font.GetSafeHandle()) m_font.DeleteObject(); LOGFONT lf = *pLogFont; lf.lfWeight = m_bBold ? FW_BOLD : FW_NORMAL; m_font.CreateFontIndirect(&lf); if(bRedraw) RedrawWindow(); } /***************************************************************************************/ // SetFont void CXColorStatic::SetFont(LPCTSTR lpszFaceName, int iPointSize, BOOL bRedraw /* = TRUE */) { // 如果指定的字体名字不存在或未指定, 将使用默认的字体 LOGFONT lf; memset(&lf, 0, sizeof(lf)); if(lpszFaceName == NULL) { CFont* pFont = GetFont(); ASSERT(pFont); pFont->GetLogFont(&lf); } else { _tcsncpy_s(lf.lfFaceName, lpszFaceName, sizeof(lf.lfFaceName) / sizeof(TCHAR) - 1); } lf.lfHeight = GetFontHeight(iPointSize); SetFont(&lf, bRedraw); } /***************************************************************************************/ // SetFont void CXColorStatic::SetFont(CFont *pFont, BOOL bRedraw /* = TRUE */) { ASSERT(pFont); if(!pFont) return; LOGFONT lf; memset(&lf, 0, sizeof(lf)); pFont->GetLogFont(&lf); SetFont(&lf, bRedraw); } /***************************************************************************************/ // SetTextColor void CXColorStatic::SetTextColor(COLORREF rgb, BOOL bRedraw /* = TRUE */) { m_rgbText = rgb; if(bRedraw) RedrawWindow(); } /***************************************************************************************/ // SetBold void CXColorStatic::SetBold(BOOL bFlag, BOOL bRedraw /* = TRUE */) { m_bBold = bFlag; LOGFONT lf; memset(&lf, 0, sizeof(lf)); CFont* pFont = GetFont(); ASSERT(pFont); pFont->GetLogFont(&lf); lf.lfWeight = m_bBold ? FW_BOLD : FW_NORMAL; SetFont(&lf, bRedraw); } /***************************************************************************************/ // SetBackgroundColor void CXColorStatic::SetBackgroundColor(COLORREF rgb, BOOL bRedraw /* = TRUE */) { m_rgbBackground = rgb; if(m_pBrush) { m_pBrush->DeleteObject(); delete m_pBrush; } m_pBrush = new CBrush(m_rgbBackground); if(bRedraw) RedrawWindow(); } /***************************************************************************************/ // SetIcon void CXColorStatic::SetIcon(HICON hIcon, BOOL bRedraw /* = TRUE */) { ASSERT(hIcon); m_hIcon = hIcon; if(bRedraw) RedrawWindow(); }