最近一个项目中有一个需求,痛苦多多日终于实现。
目的:实现在静态文本控件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;
}
目的:实现在静态文本控件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;
}
浙公网安备 33010602011771号