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

类别:软件工程 点击:0 评论:0 推荐:

简单封装的一个彩色进度条【原创】
//=========================================================
//
// 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