//=========================================================
//
// 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(25500))        ;
    m_clrEnd        
= COLORREF(RGB(00255))    ;
    m_clrBkGround    
= ::GetSysColor(COLOR_3DFACE)            ;
    m_clrText        
= COLORREF(RGB(255255255))    ;

    
// 显示百分比,文字
    m_bShowPercent    = TRUE ;
    m_bShowText    
= TRUE ;

    m_BKGroundBrush.CreateSolidBrush(m_clrBkGround)    ;
    memset(m_Text, 
032);
}

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;
        }
    }
}
posted on 2007-02-23 14:29  张尹  阅读(668)  评论(0编辑  收藏  举报