简单封装的一个彩色进度条

// =========================================================
//
//  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 ;
        }
    }
}

你可能感兴趣的:(进度条)