静态文本控件自绘

当需要在使用皮肤的环境中改变静态文本控件的背景色和文本颜色时,普通的OnCtlColor()方法可能无效。解决办法是通过自绘实现。由于CStatic控件在属性编辑器中没有OwnerDraw属性,可以重写PreSubclassWindow()来设置自定义类CColorStatic的自绘属性。在CColorStatic类中,可以通过SetColor()函数设定背景和文本颜色,如设置红色背景、白色文字或绿色背景、白色文字。在 OnInitDialog() 中初始化这些控件,并确保在资源编辑时选择合适的尺寸以达到理想效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       有时候静态文本控件要设置背景色和文本颜色,如果使用了皮肤的话,使用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));  //设置背景绿色,文字白色


注意:在资源编辑拖放静态文本控件时,注意尺寸。合适的尺寸效果比较好。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值