子夜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
最近一个项目中有一个需求,痛苦多多日终于实现。

目的:实现在静态文本控件CStaic中设置背景颜色,文字颜色。
平台:VC.net2003

实现:1、从CStatic继承一个子类,添加背景颜色和文字颜色变量:
COLORREF m_crBackColor;  // 给定的绘制颜色
COLORREF m_crTextColor;  // 文本颜色

2、重写OnPaint 函数:
3、手工添加on_WM_CTLCOLOR_REFLECT() 消息(消息反射), (这是重点!!)
     添加相应函数
    afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);

   说明:一开始我响应on_WM_CTLCOLOR ,一改变文字,背景就出现闪烁,且此函数从不被调用。原来此函数是通知父控件的,所以自己没办法响应,使用消息反射,正好解决这个问题。

4、响应ON_WM_ERASEBKGND() ,返回TRUE;

//--------------------------------------------------------------------

void CColorLabel::OnPaint()
{

CPaintDC dc(this); // device context for painting

CRect rectClient;
GetClientRect(&rectClient);
// Erase background
CBrush cBrush(::GetSysColor(COLOR_3DFACE));
if (!m_bUseDefaultBackColor)
{
  cBrush.DeleteObject();
  cBrush.CreateSolidBrush(m_crBackColor);
}
dc.FillRect(rectClient, &cBrush);
cBrush.DeleteObject();
//-------------------------------
CString strText;
GetWindowText(strText);
dc.SetTextColor(!m_bUseDefaultTextColor ? m_crTextColor : ::GetSysColor(COLOR_WINDOWTEXT));
// Set current font
CFont *pOldFont = dc.SelectObject(&m_cFont);
// Set Back Mode
int iOldMode = dc.SetBkMode(TRANSPARENT);

dc.SetBkMode(TRANSPARENT);
dc.DrawText(strText, -1, &rectClient, GetStyle());
dc.SetBkMode(iOldMode);
}
//------------------------------------------------------------------------------------
void CColorLabel::SetBackColor(COLORREF color)
{
m_crBackColor = color;
m_bUseDefaultBackColor = FALSE;

if (m_hBackBrush != NULL) {
  ::DeleteObject(m_hBackBrush);
}
m_hBackBrush = ::CreateSolidBrush(color);
}
//----------------------------------------------------------------------------------

HBRUSH CColorLabel::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);  
pDC->SetTextColor(m_crTextColor);  
if (m_hBackBrush == NULL) {
  m_hBackBrush = ::CreateSolidBrush(m_crBackColor);
}
pDC->SetBkColor(m_crBackColor);
return m_hBackBrush;
}
posted on 2011-04-01 15:50  子夜  阅读(729)  评论(0)    收藏  举报