VC2005中改变CStatic的颜色及形状

默认分类   2009-06-03 13:23   阅读39   评论0  
字号:    

                         因为要用到一些标志,类似红绿灯的,开始想用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);
}

评论(?)
阅读(?)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009