CSDN博客

img waterpub

简单封装的一个彩色进度条【原创】

发表于2004/12/28 20:24:00  1517人阅读

//=========================================================
//
// 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@mail.csdn.net
//
//=========================================================
#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@mail.csdn.net
//
//=========================================================
#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;
		}
	}
}
 
0 0

相关博文

我的热门文章

img
取 消
img