欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>杂项>>文章内容
简单封装的一个彩色进度条【原创】
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
 
//=========================================================

//

// Copyright (c) 2000-2004  iWise Technologies,Co. Ltd.

// All Rights Reserved.

//

// Product: iW988

// File: GradientProgressCtrl.h

// Created: 天衣有缝

//  

// Description:2004.12.28 20:12:00

//     ValueAdded main program for iW988.

//                   Contact:

//                       waterpub@{域名已经过期}

//

//=========================================================

#pragma once 



class CGradientProgressCtrl : public CProgressCtrl

{

public:

	CGradientProgressCtrl()					;	// 构造

	virtual ~CGradientProgressCtrl()			;	// 析构



	int  SetPos(int nPos)					;	// 设置位置

	int  SetStep(int nStep)					;	// 设置步进值

	void SetRange(int nLower, int nUpper)			;	// 设置范围

	int  SetText(const char * pText, BOOL bRepaint = TRUE)	;	// 设置显示文字



public:

	void ShowPercent(BOOL bShowPercent = TRUE)	{ m_bShowPercent = bShowPercent; }	    // 显示百分比

	void ShowText(BOOL bShowText = TRUE)		{ m_bShowText = bShowText; }    // 显示文字



public:

	COLORREF GetTextColor(void)	{ return m_clrText	; }		// 取得字体颜色

	COLORREF GetBkColor(void)		{ return m_clrBkGround	; }	// 取得背景颜色

	COLORREF GetStartColor(void)	{ return m_clrStart	; }		// 取得开始颜色

	COLORREF GetEndColor(void)		{ return m_clrEnd		; }	// 取得结束颜色

	void SetStartColor(COLORREF color)	{ m_clrStart	= color ; }		// 设置字体颜色

	void SetEndColor(COLORREF color)	{ m_clrEnd	= color ; }		// 设置背景颜色

	void SetTextColor(COLORREF color)	{ m_clrText	= color ; }		// 设置开始颜色

	void SetBkColor(COLORREF color)						        // 设置结束颜色

	{

		m_clrBkGround = color ;

		m_BKGroundBrush.DeleteObject();

		m_BKGroundBrush.CreateSolidBrush(m_clrBkGround);

	}



private:

	void Draw(CPaintDC* pDC, const RECT& rectClient, const int& nMaxWidth);

	afx_msg void OnPaint();

	DECLARE_MESSAGE_MAP()



private:

	// 变量定义

	int			m_nLower			;	// 最小值

	int			m_nUpper			;	// 最大值

	int			m_nStep			        ;	// 步进值

	int			m_nCurPos			;	// 当前值

	COLORREF m_clrStart		        ;	// 起始颜色

	COLORREF	m_clrEnd		;	// 结束颜色

	COLORREF	m_clrBkGround		;	// 背景颜色

	COLORREF	m_clrText		;	// 文本颜色

	BOOL		m_bShowPercent		;	// 显示百分比

	BOOL		m_bShowText		;	// 显示文字



	char		m_Text[32]		;	// 文字:如显示拷贝速度

	char		m_Percent[4]		;	// 文字:百分比



	CBrush		m_BKGroundBrush		;	// 背景刷子

	CBrush		m_TempBrush		;        // 临时刷子



private:

	// 内嵌类

	class CMemDC : public CDC			// 内存设备环境

	{

	public:

		CMemDC(CDC* pDC):CDC()

		{

			ASSERT(pDC != NULL);



			m_pDC = pDC;

			m_pOldBitmap = NULL;

			m_bMemDC = !pDC->IsPrinting();

			// 图形设备还是打印机设备

			if (m_bMemDC)

			{

				pDC->GetClipBox(&m_rect);

				CreateCompatibleDC(pDC);

				m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());

				m_pOldBitmap = SelectObject(&m_bitmap);

				SetWindowOrg(m_rect.left, m_rect.top);

			}

			else	//为相关的现有设备准备打印

			{

				m_bPrinting = pDC->m_bPrinting;

				m_hDC = pDC->m_hDC;

				m_hAttribDC = pDC->m_hAttribDC;

			}

		}

		virtual ~CMemDC()

		{

			if (m_bMemDC)

			{

				m_pDC->BitBlt(m_rect.left, 

					     m_rect.top, 

					     m_rect.Width(),

					     m_rect.Height(), 

					     this, 

					     m_rect.left, 

					     m_rect.top,

					     SRCCOPY

					     );

				SelectObject(m_pOldBitmap);

			}

			else

			{

				m_hDC = m_hAttribDC = NULL;

			}

		}

		CMemDC* operator->()

		{

			return this;

		}

		operator CMemDC*()

		{

			return this;

		}

	private:

		CBitmap m_bitmap;

		CBitmap* m_pOldBitmap;  		//

		CDC* m_pDC; 			        //

		CRect m_rect;   			//

		BOOL m_bMemDC;  			//

	};



};

//=========================================================

//

// Copyright (c) 2000-2004  iWise Technologies,Co. Ltd.

// All Rights Reserved.

//

// Product: iW988

// File: GradientProgressCtrl.cpp

// Created: 天衣有缝

//  

// Description:

//     ValueAdded main program for iW988.

//                   Contact:

//                       waterpub@{域名已经过期}

//

//=========================================================

#include "stdafx.h" 

#include "GradientProgressCtrl.h" 



CGradientProgressCtrl::CGradientProgressCtrl()

{

	// 控件初始化

	m_nLower	        = 0		;

	m_nUpper	        = 100	        ;

	m_nCurPos	        = 0		;

	m_nStep                 = 1		;



	// 初始化显示颜色

	m_clrStart	= COLORREF(RGB(255, 0, 0))		;

	m_clrEnd		= COLORREF(RGB(0, 0, 255))	;

	m_clrBkGround	= ::GetSysColor(COLOR_3DFACE)	        ;

	m_clrText		= COLORREF(RGB(255, 255, 255))	;



	// 显示百分比,文字

	m_bShowPercent	= TRUE ;

	m_bShowText	= TRUE ;



	m_BKGroundBrush.CreateSolidBrush(m_clrBkGround)	;

	memset(m_Text, 0, 32);

}



CGradientProgressCtrl::~CGradientProgressCtrl()

{

	m_BKGroundBrush.DeleteObject();

}



BEGIN_MESSAGE_MAP(CGradientProgressCtrl, CProgressCtrl)

	ON_WM_PAINT()

END_MESSAGE_MAP()



/////////////////////////////////////////////////////////////////////////////

// CGradientProgressCtrl 消息处理程序



void CGradientProgressCtrl::SetRange(int nLower, int nUpper)

{

	// 设置进度条的范围

	m_nLower	= nLower ;

	m_nUpper	= nUpper ;

	m_nCurPos	= nLower ;



	CProgressCtrl::SetRange(nLower, nUpper);

	CProgressCtrl::SetPos(nLower);

}



int CGradientProgressCtrl::SetStep(int nStep)

{

	// 设置步进值

	m_nStep = nStep;

	return (CProgressCtrl::SetStep(nStep));

}



int CGradientProgressCtrl::SetPos(int nPos)

{

	// 设置进度条位置

	m_nCurPos = nPos;

	return (CProgressCtrl::SetPos(nPos));

}



int CGradientProgressCtrl::SetText(const char * pText, BOOL bRepaint)

{

	// 显示的文字

	strcpy(m_Text, pText);

	if (bRepaint && m_bShowText)

	{

		Invalidate(TRUE);

	}



	return 0;

}



void CGradientProgressCtrl::OnPaint()

{

	CPaintDC dc(this); // 设备环境



	// TODO: 重画进度条

	RECT rectClient;

	GetClientRect(&rectClient);



	if (m_nCurPos <= m_nLower || m_nCurPos > m_nUpper)

	{

		// 不在范围之内直接以背景色填充

		dc.FillRect(&rectClient, &m_BKGroundBrush);

		return;

	}



	// 绘制进度条本身

	float maxWidth((float) m_nCurPos /(float) m_nUpper*(float) rectClient.right);

	Draw(&dc, rectClient, (int) maxWidth);



	// 文字显示

	dc.SetTextColor(m_clrText);

	dc.SetBkMode(TRANSPARENT);

	HGDIOBJ hOldFont = ::SelectObject(dc.m_hDC, ::GetStockObject(DEFAULT_GUI_FONT));

	if (m_bShowPercent)

	{

		// 显示进程条百分比

		sprintf(m_Percent, "%d%% ",(int) (100 * (float) m_nCurPos / m_nUpper));

		dc.DrawText(m_Percent, &rectClient, DT_VCENTER | DT_CENTER | DT_SINGLELINE);

	}

	if (m_bShowText)

	{

		// 显示进程条文字

		rectClient.left = (rectClient.left + rectClient.right) / 2;

		dc.DrawText(m_Text, &rectClient, DT_VCENTER | DT_CENTER | DT_SINGLELINE);

	}

	::SelectObject(dc.m_hDC, hOldFont);



	// 不要调用 CProgressCtrl::OnPaint()

}



void CGradientProgressCtrl::Draw(CPaintDC* pDC, const RECT& rectClient, const int& nMaxWidth)

{

	RECT rectFill;			//显示区域

	float fStep;			//每一步的幅宽

	CMemDC memDC(pDC);	



	int r, g, b;

	float rStep, gStep, bStep;

	//得到不同颜色并相减,返回颜色之间的最大差值

	r = (GetRValue(m_clrEnd) - GetRValue(m_clrStart));

	g = (GetGValue(m_clrEnd) - GetGValue(m_clrStart));

	b = (GetBValue(m_clrEnd) - GetBValue(m_clrStart));

	//使进程条显示的总数 等于最大的颜色差值

	int nSteps = max(abs(r), max(abs(g), abs(b)));

	//确定每一颜色填充多大的矩形区域

	fStep = (float) rectClient.right / (float) nSteps;

	//设置每一颜色填充的步数

	rStep = r / (float) nSteps;

	gStep = g / (float) nSteps;

	bStep = b / (float) nSteps;



	r = GetRValue(m_clrStart);

	g = GetGValue(m_clrStart);

	b = GetBValue(m_clrStart);

	//绘制颜色渐变的进程条

	for (int iOnBand = 0; iOnBand < nSteps; iOnBand++)

	{

		::SetRect(&rectFill, (int) (iOnBand * fStep), 0,// 填充矩形区域的左上角x,y和右下角x,y

			(int) ((iOnBand + 1) * fStep), rectClient.bottom + 1);



		VERIFY(m_TempBrush.CreateSolidBrush(RGB(r + rStep * iOnBand,

										g + gStep * iOnBand,

										b + bStep * iOnBand)));

		memDC.FillRect(&rectFill, &m_TempBrush);

		VERIFY(m_TempBrush.DeleteObject());

		//在结束绘制之前,使用背景色填充乘下的的客户区域

		if (rectFill.right > nMaxWidth)

		{

			::SetRect(&rectFill, rectFill.right, 0, rectClient.right,

				rectClient.bottom);

			VERIFY(m_TempBrush.CreateSolidBrush(m_clrBkGround));

			memDC.FillRect(&rectFill, &m_TempBrush);

			VERIFY(m_TempBrush.DeleteObject());

			return;

		}

	}

}

 

附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步