首先有个问题必须弄明白:
消息反射——允许控件在给父窗口发送OnCtlColor消息前就自行处理的消息
几种属性——前景色,背景色,背景刷。
一个CStaitc控件在UI表现上有以上3种属性。前景色即文本颜色,背景色是文本背后的颜色。
画刷则控制整个控件区域的色彩显示,如果控件区域比文本所占区域大,那你会发现这个色
彩和背景色的区别
----------------------------------------------------------------------------------------------
更新时间:2007年01月13日
改进后的文本能使用SetWndowText函数进行实现动态文本.
源代码文件如下:
// 类的声明文件
//--------------------------------------------------------------------------------------
// 类说明:可改变文本颜色和背景颜色,也可为透明的CColorStatic
// By Yao Debo
// E-mail:yaodebo@163.com
//--------------------------------------------------------------------------------------
// ColorStatic.h: Head file
#pragma once
class CColorStatic : public CStatic
{
public:
CColorStatic();
public:
void SetBkColor(COLORREF crBkColor=0xffffffff);
void SetTextColor(COLORREF crTextColor=0xffffffff);
COLORREF GetTextColor();
COLORREF GetBkColor();
virtual ~CColorStatic();
// Generated message map functions
protected:
//{{AFX_MSG(CColorStatic)
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg void OnDestroy();
afx_msg LRESULT OnSetWindowText(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
bool m_bTransparent;
CBrush m_brBkgnd;
COLORREF m_crBkColor;
COLORREF m_crTextColor;
};
// 类的实现文件
////////////////////////////////////////////////////////////////////////////
// ColorStatic.cpp : implementation file
//
#include "stdafx.h"
#include "ColorStatic.h"
#include ".\colorstatic.h"
// CColorStatic
CColorStatic::CColorStatic():CStatic()
{
// 这里的顺序很重要
m_crTextColor=::GetSysColor (COLOR_BTNTEXT);
m_crBkColor=::GetSysColor (COLOR_BTNFACE);
m_brBkgnd.CreateSolidBrush (m_crBkColor);
m_bTransparent = true;
}
CColorStatic::~CColorStatic()
{
}
BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
//{{AFX_MSG_MAP(CColorStatic)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_DESTROY()
ON_MESSAGE(WM_SETTEXT,OnSetWindowText)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetTextColor (m_crTextColor);
// 如果未调用了SetBkColor成员函数,则背景透明,否则不透明
if( m_bTransparent)
{
// 以下为改进代码,能实现透明的static
pDC->SetBkMode( TRANSPARENT );
return (HBRUSH)GetStockObject( NULL_BRUSH );
}
else
{
pDC->SetBkColor (m_crBkColor);
return (HBRUSH)m_brBkgnd;
}
}
void CColorStatic::OnDestroy()
{
CStatic::OnDestroy();
m_brBkgnd.DeleteObject ();
}
/*----------------------------------------
函数名称:COLORREF CColorStatic::GetBkColor()
功 能:取背景顔色
参数说明:无
返 回 值:返回背景顔色
----------------------------------------*/
COLORREF CColorStatic::GetBkColor()
{
return m_crBkColor;
}
/*----------------------------------------
函数名称:COLORREF CColorStatic::GetTextColor()
功 能:取字体顔色。
参数说明:无
返 回 值:返回字体顔色
----------------------------------------*/
COLORREF CColorStatic::GetTextColor()
{
return m_crTextColor;
}
/*----------------------------------------
函数名称:void SetTextColor(COLORREF crTextColor)
功 能:设置字体顔色
参数说明:crTextColor-----顔色变量
----------------------------------------*/
void CColorStatic::SetTextColor(COLORREF crTextColor)
{
if(crTextColor!=0xffffffff)
{
m_crTextColor=crTextColor;
}
else
{
m_crTextColor=::GetSysColor (COLOR_BTNTEXT);
}
Invalidate ();
}
/*----------------------------------------
函数名称:void SetBkColor(COLORREF crBkColor)
功 能:设置背景顔色(一旦调用该函数,static不再透明)
参数说明:crBkColor------顔色变量
----------------------------------------*/
void CColorStatic::SetBkColor(COLORREF crBkColor)
{
m_bTransparent = false;
if(crBkColor!=0xffffffff)
m_crBkColor=crBkColor;
else
m_crBkColor=::GetSysColor (COLOR_BTNFACE);
m_brBkgnd.DeleteObject ();
m_brBkgnd.CreateSolidBrush (m_crBkColor);
Invalidate ();
}
/*----------------------------------------
函数名称:LRESULT OnSetWindowText(WPARAM wParam, LPARAM lParam)
功 能:自定义函数,接收WM_SETTEXT消息并处理
参数说明:
----------------------------------------*/
LRESULT CColorStatic::OnSetWindowText(WPARAM wParam, LPARAM lParam)
{
if(m_bTransparent)
{
// 必须先擦除背景,由于透明的控件没画刷,必须由父窗口来完成
HWND hWnd = NULL;
hWnd = GetParent()->GetSafeHwnd();
ASSERT(hWnd!=NULL);
CRect rectChild;
::GetWindowRect(this->m_hWnd,&rectChild);
(CWnd::FromHandle(hWnd))->ScreenToClient(&rectChild);
::InvalidateRect(hWnd,&rectChild,true);
}
return Default();
}