中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Web开发 > JavaScripts > 综合文章
简单封装的一个彩色进度条【原创】
作者:佚名 时间:2005-02-18 11:03 出处:互连网 责编:chinaitpower
              摘要:简单封装的一个彩色进度条【原创】
//=========================================================
//
// 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;
}
}
}
 
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有