有时候静态文本控件要设置背景色和文本颜色,如果使用了皮肤的话,使用OnCtlColor()消息会无法实现,这时候要使用自绘.一般的控件先要设置OwnerDraw属性为True.但是静态文本控件在属性编辑器中没有OwnerDraw属性。刚开始到这里以为没辙了,百度后找到答案了,那就是重写PreSubclassWindow()来设置自绘属性了
1.首先写一个继承自CStatic的类CColorStatic,这个类名自己定义,例如:
#pragma once
// CColorStatic
class CColorStatic : public CStatic
{
DECLARE_DYNAMIC(CColorStatic)
//定义两个变量:m_bkColor背景色,m_textColor文本色
COLORREF m_bkColor,m_textColor;
public:
CColorStatic();
virtual ~CColorStatic();
//定义设置颜色的函数
void SetColor(COLORREF bkColor,COLORREF textColor)
{
m_bkColor=bkColor;
m_textColor=textColor;
}
protected:
DECLARE_MESSAGE_MAP()
public:
virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
virtual void PreSubclassWindow();
};
2 .重写虚函数 PreSubclassWindow () 设置自绘属性
void CColorStatic::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
DWORD dwstyle = GetStyle();
SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwstyle | SS_OWNERDRAW ); //设置自绘属性
CStatic::PreSubclassWindow();
}
3.重写虚函数DrawItem()
void CColorStatic::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC dc;
dc.Attach(lpDIS->hDC); //获取控件DC
dc.SetBkMode(TRANSPARENT); //设置背景色透明
CRect rect=lpDIS->rcItem; //获取控件矩形
dc.FillSolidRect(rect,m_bkColor); //背景色填充矩形
CString str;
GetWindowText(str); //获取控件原文本
dc.SetTextColor(m_textColor); //设置文本颜色
dc.TextOut(1,1,str); //画文本至控件
dc.Detach();
// TODO: 添加您的代码以绘制指定项
}
4.为静态文本控件添加成员变量,修改变量类型为CColorStatic,并添加头文件“ColorStatic.h”.例如:
CColorStatic m_static3;
CColorStatic m_static2;
CColorStatic m_static4;
5.在OnInitDialog()中调用CColorStatic 类的函数SetColor()来设置静态文本的控件了。
m_static2.SetColor(RGB(255,0,0),RGB(255,255,255)); //设置背景红色,文字白色
m_static4.SetColor(RGB(0,255,0),RGB(255,255,255)); //设置背景绿色,文字白色
注意:在资源编辑拖放静态文本控件时,注意尺寸。合适的尺寸效果比较好。