VC2005中改变CStatic的颜色及形状
因为要用到一些标志,类似红绿灯的,开始想用CButton,找了,很不好用,想到其实不用按钮,所以就找了CStatic来实现。在网上找到了源码,但只是改变颜色,做了些修改,可以改变颜色及字体,还可以画出圆形。
头文件
#ifndef _COLORST_H
#define _COLORST_H
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
class CColorCStatic : public CStatic
{
DECLARE_DYNAMIC(CColorCStatic)
public:
CColorCStatic();
virtual ~CColorCStatic();
protected:
afx_msg void OnPaint();
void drawText();
void drawCircle();
protected:
DECLARE_MESSAGE_MAP()
protected:
CString m_strCaption;
COLORREF m_BackColor;
COLORREF m_TextColor;
INT m_fontSize;
BOOL m_blCircle;
INT m_circleRaidus;
// Operations
public:
void SetTextColor( COLORREF TextColor );
void SetBackColor( COLORREF BackColor );
void SetCaption( CString strCaption );
void SetFontSize(INT nSize);
void SetDrawCircle(BOOL bl);
void SetCircleRaidus(INT raidus);
public:
// afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
};
#endif
源码:
#include "stdafx.h"
#include "CColorCStatic.h"
// CColorCStatic
IMPLEMENT_DYNAMIC(CColorCStatic, CStatic)
CColorCStatic::CColorCStatic()
{
m_fontSize = 11;
m_TextColor = RGB(0, 0, 0);
m_blCircle = FALSE;
m_circleRaidus = 15;
}
CColorCStatic::~CColorCStatic()
{
}
BEGIN_MESSAGE_MAP(CColorCStatic, CStatic)
ON_WM_PAINT()
// ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()
// CColorCStatic 消息处理程序
void CColorCStatic::SetTextColor( COLORREF TextColor )
{
m_TextColor = TextColor; //设置文字颜色
}
void CColorCStatic::SetDrawCircle(BOOL bl)
{
m_blCircle = bl;
}
void CColorCStatic::SetCircleRaidus(INT raidus)
{
m_circleRaidus = raidus;
}
//为CMultiColorStatic类添加“设置背景颜色”接口
void CColorCStatic::SetBackColor( COLORREF BackColor )
{
m_BackColor = BackColor; //设置背景颜色
}
//为CMultiColorStatic类添加“设置标题”接口
void CColorCStatic::SetCaption( CString strCaption )
{
m_strCaption = strCaption;
}
void CColorCStatic::SetFontSize(INT nSize)
{
m_fontSize = nSize;
}
void CColorCStatic::OnPaint()
{
if (m_blCircle)
drawCircle();
else
drawText();
}
void CColorCStatic::drawCircle()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect( &rect );
CPen hPen(PS_SOLID, 1, m_BackColor);
CBrush pBrush;
pBrush.CreateSolidBrush(m_BackColor);
CBrush* pOldBrush = dc.SelectObject(&pBrush);
HGDIOBJ pOldPen = dc.SelectObject(&hPen);
INT x = rect.left + (rect.right-rect.left)/2;
INT y = rect.top + (rect.bottom-rect.top)/2;
dc.Ellipse(x-m_circleRaidus, y-m_circleRaidus,x+m_circleRaidus, y+m_circleRaidus);
//dc.Rectangle(&rect);
DeleteObject(hPen);
DeleteObject(pBrush);
dc.SelectObject(pOldBrush);
dc.SelectObject(pOldPen);
}
void CColorCStatic::drawText()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect( &rect );
// CBrush BGBrush;
// BGBrush.CreateSolidBrush(m_BackColor);
// dc.SelectObject(&BGBrush);
// dc.Rectangle(&rect);
// dc.SetBkMode( TRANSPARENT );
//dialog backgroud color
dc.SetBkColor(RGB(240, 240, 177));
CFont *pFont=GetParent()->GetFont();//得到父窗体的字体
CFont *pOldFont;
HFONT hFont;
hFont = CreateFont(MulDiv(m_fontSize, -dc.GetDeviceCaps(LOGPIXELSY),72), 0, 0, 0, FW_EXTRABOLD, 0, 0, 0, ANSI_CHARSET, OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, DRAFT_QUALITY, VARIABLE_PITCH|FF_SWISS, _T("Arial"));
pOldFont=dc.SelectObject(pFont);//选用父窗体的字体
SelectObject(dc,hFont);
dc.SetTextColor(m_TextColor);//设置文本颜色
dc.DrawText(m_strCaption,&rect,DT_LEFT);//将文本画在Static的左边
dc.SelectObject(pOldFont);
DeleteObject(hFont);
}