简单封装的一个彩色进度条【原创】
//=========================================================
//
// 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:
// [email protected]
//
//=========================================================
#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:
// [email protected]
//
//=========================================================
#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;
}
}
}
本文地址:http://com.8s8s.com/it/it32471.htm