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


    //=========================================================
    //
    // 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;
            }
        }
    }
  • 相关阅读:
    Linux开发工具之Makefile(上)
    Linux shell入门基础(八)
    Linux开发工具之gcc
    Linux shell入门基础(七)
    Linux shell入门基础(六)
    Linux shell入门基础(五)
    Linux shell入门基础(四)
    随机洗牌算法
    Windows中查找文件被何进程使用
    哲学家进餐问题解析
  • 原文地址:https://www.cnblogs.com/zhangyin/p/654439.html
Copyright © 2020-2023  润新知