如何制作一个可以显示文字的进度条?请各位指点,给出使用方法最好!!多谢!!

解决方案 »

  1.   

      这是一个比较简单的有关于进度条控制的类,它在进度框中能够显示文件名和百分比,我想读者肯定在装软件的时候看到过。这个类最重要的功能就是允许在进度条中显示文字,如下:   void setshowtext(bool bshow);   你可以通过这个函数来设置是否能显示文字。设置文字你可以用cwnd::setwindowtext,如果你用函数setshowtext(true)来设置能显示文字,但是你没有用cwnd::setwindowtext来设置要显示的文字是什么,那么该类就会用默认的设置,只显示进度百分比,这点大家还是要注意的。   由于本人是菜鸟级的VC编程手,还没有完全理解其中的内容,也就是说没有看完全部的代码,我希望读者能把它读完,会更有好处。下面是其中的一些函数的功能,请大家笑纳: void SetForeColour(colorref col)    设置进度条中的条的颜色 
    void SetBkColour(colorref col)     设置进度条的背景色 
    void SetTextForeColour(colorref col)  当进度条没有覆盖文本时,文本的颜色 
    void SetTextBkColour(colorref col)   当进度条覆盖文本时,文本的颜色 
    CORLORREF GetForeColour()        得到进度条中条的颜色 
    CORLORREF GetBkColour()         得到进度条的背景色 
    CORLORREF GetTextForeColour()      当进度条没有覆盖文本时,得到文本的颜色 
    CORLORREF GetTextBkColour()       当进度条覆盖文本时,得到文本的颜色 
     下面是全部的代码,包括H文件CPP文件 //以下是H文件 
    #if !defined(AFX_TEXTPROGRESSCTRL_H__4C78DBBE_EFB6_11D1_AB14_203E25000000__INCLUDED_) 
    #define AFX_TEXTPROGRESSCTRL_H__4C78DBBE_EFB6_11D1_AB14_203E25000000__INCLUDED_ #if _MSC_VER >= 1000 
    #pragma once 
    #endif // _MSC_VER >= 1000 // TextProgressCtrl.h : header file 
    // 
    // Written by Chris Maunder ([email protected]
    // Copyright 1998. 
    ///////////////////////////////////////////////////////////////////////////// 
    // CTextProgressCtrl window class CTextProgressCtrl : public CProgressCtrl 

    // Construction 
    public: 
      CTextProgressCtrl(); // Attributes 
    public: // Operations 
    public: 
      int      SetPos(int nPos); 
      int      StepIt(); 
      void    SetRange(int nLower, int nUpper); 
      int      OffsetPos(int nPos); 
      int      SetStep(int nStep); 
      void    SetForeColour(COLORREF col); 
      void    SetBkColour(COLORREF col); 
      void    SetTextForeColour(COLORREF col); 
      void    SetTextBkColour(COLORREF col); 
      COLORREF  GetForeColour(); 
      COLORREF  GetBkColour(); 
      COLORREF  GetTextForeColour(); 
      COLORREF  GetTextBkColour();   void    SetShowText(BOOL bShow); // Overrides 
      // ClassWizard generated virtual function overrides 
      //{{AFX_VIRTUAL(CTextProgressCtrl) 
      //}}AFX_VIRTUAL // Implementation 
    public: 
      virtual ~CTextProgressCtrl();   // Generated message map functions 
    protected: 
      int      m_nPos, 
            m_nStepSize, 
            m_nMax, 
            m_nMin; 
      CString    m_strText; 
      BOOL    m_bShowText; 
      int      m_nBarWidth; 
      COLORREF  m_colFore, 
            m_colBk, 
            m_colTextFore, 
            m_colTextBk;   //{{AFX_MSG(CTextProgressCtrl) 
      afx_msg BOOL OnEraseBkgnd(CDC* pDC); 
      afx_msg void OnPaint(); 
      afx_msg void OnSize(UINT nType, int cx, int cy); 
      //}}AFX_MSG 
      afx_msg LRESULT OnSetText(UINT, LPCTSTR szText); 
      afx_msg LRESULT OnGetText(UINT cchTextMax, LPTSTR szText);   DECLARE_MESSAGE_MAP() 
    }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} 
    // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_TEXTPROGRESSCTRL_H__4C78DBBE_EFB6_11D1_AB14_203E25000000__INCLUDED_) //以下是CPP文件 
    // TextProgressCtrl.cpp : implementation file 
    // 
    // Written by Chris Maunder ([email protected]
    // Copyright 1998. 
    // 
    // Modified : 26/05/98 Jeremy Davis, [email protected] 
    //        Added colour routines 
    // 
    // TextProgressCtrl is a drop-in replacement for the standard 
    // CProgressCtrl that displays text in a progress control. 
    // 
    // This code may be used in compiled form in any way you desire. This 
    // file may be redistributed by any means PROVIDING it is not sold for 
    // profit without the authors written consent, and providing that this 
    // notice and the authors name is included. If the source code in 
    // this file is used in any commercial application then an email to 
    // the me would be nice. 
    // 
    // This file is provided "as is" with no expressed or implied warranty. 
    // The author accepts no liability if it causes any damage to your 
    // computer, causes your pet cat to fall ill, increases baldness or 
    // makes you car start emitting strange noises when you start it up. 
    // 
    // Expect bugs. 
    // 
    // Please use and enjoy. Please let me know of any bugs/mods/improvements 
    // that you have found/implemented and I will fix/incorporate them into this 
      

  2.   

    // file. #include "stdafx.h" 
    #include "TextProgressCtrl.h" #ifdef _DEBUG 
    #define new DEBUG_NEW 
    #undef THIS_FILE 
    static char THIS_FILE[] = __FILE__; 
    #endif 
    #ifndef _MEMDC_H_ 
    ////////////////////////////////////////////////// 
    // CMemDC - memory DC 
    // 
    // Author: Keith Rule 
    // Email: [email protected] 
    // Copyright 1996-1997, Keith Rule 
    // 
    // You may freely use or modify this code provided this 
    // Copyright is included in all derived versions. 
    // 
    // History - 10/3/97 Fixed scrolling bug. 
    //          Added print support. 
    // 
    // This class implements a memory Device Context class CMemDC : public CDC 

    public:   // constructor sets up the memory DC 
      CMemDC(CDC* pDC) : CDC() 
      { 
        ASSERT(pDC != NULL);     m_pDC = pDC; 
        m_pOldBitmap = NULL; 
        m_bMemDC = !pDC->IsPrinting(); 
            
        if (m_bMemDC)  // Create a Memory DC 
        { 
          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    // Make a copy of the relevent parts of the current DC for printing 
        { 
          m_bPrinting = pDC->m_bPrinting; 
          m_hDC    = pDC->m_hDC; 
          m_hAttribDC = pDC->m_hAttribDC; 
        } 
      } 
       
      // Destructor copies the contents of the mem DC to the original DC 
      ~CMemDC() 
      { 
        if (m_bMemDC) 
        {   
          // Copy the offscreen bitmap onto the screen. 
          m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), 
                 this, m_rect.left, m_rect.top, SRCCOPY);       //Swap back the original bitmap. 
          SelectObject(m_pOldBitmap); 
        } else { 
          // All we need to do is replace the DC with an illegal value, 
          // this keeps us from accidently deleting the handles associated with 
          // the CDC that was passed to the constructor. 
          m_hDC = m_hAttribDC = NULL; 
        } 
      }   // Allow usage as a pointer 
      CMemDC* operator->() {return this;} 
         
      // Allow usage as a pointer 
      operator CMemDC*() {return this;} private: 
      CBitmap m_bitmap;   // Offscreen bitmap 
      CBitmap* m_pOldBitmap; // bitmap originally found in CMemDC 
      CDC*   m_pDC;     // Saves CDC passed in constructor 
      CRect  m_rect;    // Rectangle of drawing area. 
      BOOL   m_bMemDC;   // TRUE if CDC really is a Memory DC. 
    }; #endif ///////////////////////////////////////////////////////////////////////////// 
    // CTextProgressCtrl CTextProgressCtrl::CTextProgressCtrl() 

      m_nPos      = 0; 
      m_nStepSize    = 1; 
      m_nMax      = 100; 
      m_nMin      = 0; 
      m_bShowText    = TRUE; 
      m_strText.Empty(); 
      m_colFore    = ::GetSysColor(COLOR_HIGHLIGHT); 
      m_colBk      = ::GetSysColor(COLOR_WINDOW); 
      m_colTextFore  = ::GetSysColor(COLOR_HIGHLIGHT); 
      m_colTextBk    = ::GetSysColor(COLOR_WINDOW);   m_nBarWidth = -1; 
    } CTextProgressCtrl::~CTextProgressCtrl() 

    } BEGIN_MESSAGE_MAP(CTextProgressCtrl, CProgressCtrl) 
      //{{AFX_MSG_MAP(CTextProgressCtrl) 
      ON_WM_ERASEBKGND() 
      ON_WM_PAINT() 
      ON_WM_SIZE() 
      //}}AFX_MSG_MAP 
      ON_MESSAGE(WM_SETTEXT, OnSetText) 
      ON_MESSAGE(WM_GETTEXT, OnGetText) 
    END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// 
    // CTextProgressCtrl message handlers LRESULT CTextProgressCtrl::OnSetText(UINT, LPCTSTR szText) 

      LRESULT result = Default();   if ( (!szText && m_strText.GetLength()) || 
         (szText && (m_strText != szText))  ) 
      { 
        m_strText = szText; 
        Invalidate(); 
      }   return result; 
    } LRESULT CTextProgressCtrl::OnGetText(UINT cchTextMax, LPTSTR szText) 

      if (!_tcsncpy(szText, m_strText, cchTextMax)) 
        return 0; 
      else 
        return min(cchTextMax, (UINT) m_strText.GetLength()); 
    } BOOL CTextProgressCtrl::OnEraseBkgnd(CDC* /*pDC*/) 
    {   
       return TRUE; 
      

  3.   

    void CTextProgressCtrl::OnSize(UINT nType, int cx, int cy) 

      CProgressCtrl::OnSize(nType, cx, cy); 
       
      m_nBarWidth  = -1;  // Force update if SetPos called 
    } void CTextProgressCtrl::OnPaint() 

      if (m_nMin >= m_nMax) 
        return;   CRect LeftRect, RightRect, ClientRect; 
      GetClientRect(ClientRect);   double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin));   CPaintDC PaintDC(this); // device context for painting 
      CMemDC dc(&PaintDC); 
      //CPaintDC dc(this);  // device context for painting (if not double buffering)   LeftRect = RightRect = ClientRect;   LeftRect.right = LeftRect.left + (int)((LeftRect.right - LeftRect.left)*Fraction); 
      dc.FillSolidRect(LeftRect, m_colFore);   RightRect.left = LeftRect.right; 
      dc.FillSolidRect(RightRect, m_colBk);   if (m_bShowText) 
      { 
        CString str; 
        if (m_strText.GetLength()) 
          str = m_strText; 
        else 
          str.Format("%d%%", (int)(Fraction*100.0));     dc.SetBkMode(TRANSPARENT);     CRgn rgn; 
        rgn.CreateRectRgn(LeftRect.left, LeftRect.top, LeftRect.right, LeftRect.bottom); 
        dc.SelectClipRgn(&rgn); 
        dc.SetTextColor(m_colTextBk);     dc.DrawText(str, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);     rgn.DeleteObject(); 
        rgn.CreateRectRgn(RightRect.left, RightRect.top, RightRect.right, RightRect.bottom); 
        dc.SelectClipRgn(&rgn); 
        dc.SetTextColor(m_colTextFore);     dc.DrawText(str, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); 
      } 
    } void CTextProgressCtrl::SetForeColour(COLORREF col) 

      m_colFore = col; 
    } void CTextProgressCtrl::SetBkColour(COLORREF col) 

      m_colBk = col; 
    } void CTextProgressCtrl::SetTextForeColour(COLORREF col) 

      m_colTextFore = col; 
    } void CTextProgressCtrl::SetTextBkColour(COLORREF col) 

      m_colTextBk = col; 
    } COLORREF CTextProgressCtrl::GetForeColour() 

      return m_colFore; 
    } COLORREF CTextProgressCtrl::GetBkColour() 

      return m_colBk; 
    } COLORREF CTextProgressCtrl::GetTextForeColour() 

      return m_colTextFore; 
    } COLORREF CTextProgressCtrl::GetTextBkColour() 

      return m_colTextBk; 

    ///////////////////////////////////////////////////////////////////////////// 
    // CTextProgressCtrl message handlers void CTextProgressCtrl::SetShowText(BOOL bShow) 

      if (::IsWindow(m_hWnd) && m_bShowText != bShow) 
        Invalidate();   m_bShowText = bShow; 

    void CTextProgressCtrl::SetRange(int nLower, int nUpper) 

      m_nMax = nUpper; 
      m_nMin = nLower; 
    } int CTextProgressCtrl::SetPos(int nPos) 
    {   
      if (!::IsWindow(m_hWnd)) 
        return -1;   int nOldPos = m_nPos; 
      m_nPos = nPos;   CRect rect; 
      GetClientRect(rect);   double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin)); 
      int nBarWidth = (int) (Fraction * rect.Width());   if (nBarWidth != m_nBarWidth) 
      { 
        m_nBarWidth = nBarWidth; 
        RedrawWindow(); 
      }   return nOldPos; 
    } int CTextProgressCtrl::StepIt() 
    {   
      return SetPos(m_nPos + m_nStepSize); 
    } int CTextProgressCtrl::OffsetPos(int nPos) 

      return SetPos(m_nPos + nPos); 
    } int CTextProgressCtrl::SetStep(int nStep) 

      int nOldStep = nStep; 
      m_nStepSize = nStep; 
      return nOldStep; 
    }
      

  4.   

    显示文字的进度条,我看过华为的一个例子,它把一个静态文本框放到进度条的中间,然后SetWindowText
      

  5.   

    这个类的名字是:CTextProgressCtrl
    我是这样用的:
    CTextProgressCtrl *textProgress=(CTextProgress*)GetDlgItem(IDC_PRO);
    textProgress->SetRange(0,100);
    textProgress->SetPos(50);
    运行后进度条根本没反应,根部不在50的位子上。还有它那个在进度条上写文字,也不知道怎么写的。
      

  6.   

    CTextProgressCtrl::CTextProgressCtrl()
    {
        m_nPos = 0;
        m_nStepSize = 1;
        m_nMax = 100;
        m_nMin = 0;
        m_bShowText = TRUE;
        m_strText.Empty();
    m_colFore = RGB(0,0,0);//::GetSysColor(COLOR_HIGHLIGHT);
    m_colBk = RGB(0,0,0);//::GetSysColor(COLOR_WINDOW);
    m_colTextFore = RGB(255,255,255);//::GetSysColor(COLOR_HIGHLIGHT);
    m_colTextBk = RGB(255,0,0);//::GetSysColor(COLOR_WINDOW);    m_nBarWidth = -1;
    }CTextProgressCtrl::~CTextProgressCtrl()
    {
    }BEGIN_MESSAGE_MAP(CTextProgressCtrl, CProgressCtrl)
    //{{AFX_MSG_MAP(CTextProgressCtrl)
    ON_WM_ERASEBKGND()
    ON_WM_PAINT()
    ON_WM_SIZE()
    //}}AFX_MSG_MAP
        ON_MESSAGE(WM_SETTEXT, OnSetText)
        ON_MESSAGE(WM_GETTEXT, OnGetText)
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CTextProgressCtrl message handlersLRESULT CTextProgressCtrl::OnSetText(UINT, LPCTSTR szText)
    {
        LRESULT result = Default();    if ( (!szText && m_strText.GetLength()) ||
             (szText && (m_strText != szText))   )
        {
            m_strText = szText;
            Invalidate();
        }    return result;
    }LRESULT CTextProgressCtrl::OnGetText(UINT cchTextMax, LPTSTR szText)
    {
        if (!_tcsncpy(szText, m_strText, cchTextMax))
            return 0;
        else 
            return min(cchTextMax, (UINT) m_strText.GetLength());
    }BOOL CTextProgressCtrl::OnEraseBkgnd(CDC* /*pDC*/) 
    {
      return TRUE;
    }void CTextProgressCtrl::OnSize(UINT nType, int cx, int cy) 
    {
    CProgressCtrl::OnSize(nType, cx, cy);

        m_nBarWidth = -1;   // Force update if SetPos called
    }void CTextProgressCtrl::OnPaint() 
    {
        if (m_nMin >= m_nMax) 
            return;    CRect LeftRect, RightRect, ClientRect;
        GetClientRect(ClientRect);    double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin)); CPaintDC PaintDC(this); // device context for painting
        CMemDC dc(&PaintDC);
    //CPaintDC dc(this);    // device context for painting (if not double buffering)    LeftRect = RightRect = ClientRect;    LeftRect.right = LeftRect.left + (int)((LeftRect.right - LeftRect.left)*Fraction);
        dc.FillSolidRect(LeftRect, m_colFore);    RightRect.left = LeftRect.right;
        dc.FillSolidRect(RightRect, m_colBk);    if (m_bShowText)
        {
            CString str;
            if (m_strText.GetLength())
                str = m_strText;
            else
                str.Format("%d%%", (int)(Fraction*100.0));        dc.SetBkMode(TRANSPARENT);        CRgn rgn;
            rgn.CreateRectRgn(LeftRect.left, LeftRect.top, LeftRect.right, LeftRect.bottom);
            dc.SelectClipRgn(&rgn);
            dc.SetTextColor(m_colTextBk);        dc.DrawText(str, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);        rgn.DeleteObject();
            rgn.CreateRectRgn(RightRect.left, RightRect.top, RightRect.right, RightRect.bottom);
            dc.SelectClipRgn(&rgn);
            dc.SetTextColor(m_colTextFore);        dc.DrawText(str, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        }
    }void CTextProgressCtrl::SetForeColour(COLORREF col)
    {
    m_colFore = col;
    }void CTextProgressCtrl::SetBkColour(COLORREF col)
    {
    m_colBk = col;
    }void CTextProgressCtrl::SetTextForeColour(COLORREF col)
    {
    m_colTextFore = col;
    }void CTextProgressCtrl::SetTextBkColour(COLORREF col)
    {
    m_colTextBk = col;
    }COLORREF CTextProgressCtrl::GetForeColour()
    {
    return m_colFore;
    }COLORREF CTextProgressCtrl::GetBkColour()
    {
    return m_colBk;
    }COLORREF CTextProgressCtrl::GetTextForeColour()
    {
    return m_colTextFore;
    }COLORREF CTextProgressCtrl::GetTextBkColour()
    {
    return m_colTextBk;
    }
    /////////////////////////////////////////////////////////////////////////////
    // CTextProgressCtrl message handlersvoid CTextProgressCtrl::SetShowText(BOOL bShow)

        if (::IsWindow(m_hWnd) && m_bShowText != bShow)
            Invalidate();    m_bShowText = bShow;
    }
    void CTextProgressCtrl::SetRange(int nLower, int nUpper)
    {
        m_nMax = nUpper;
        m_nMin = nLower;
    }int CTextProgressCtrl::SetPos(int nPos) 
    {
        if (!::IsWindow(m_hWnd))
            return -1;    int nOldPos = m_nPos;
        m_nPos = nPos;    CRect rect;
        GetClientRect(rect);    double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin));
        int nBarWidth = (int) (Fraction * rect.Width());    if (nBarWidth != m_nBarWidth)
        {
            m_nBarWidth = nBarWidth;
            RedrawWindow();
        }    return nOldPos;
    }int CTextProgressCtrl::StepIt() 
    {
       return SetPos(m_nPos + m_nStepSize);
    }int CTextProgressCtrl::OffsetPos(int nPos)
    {
        return SetPos(m_nPos + nPos);
    }int CTextProgressCtrl::SetStep(int nStep)
    {
        int nOldStep = nStep;
        m_nStepSize = nStep;
        return nOldStep;
    }
      

  7.   

    老大,文字都没有设怎么动啊。
    m_ProgressCtrl->SetWindowText("XXX");
      

  8.   

    westeast(西东),你是怎么用这个类的?
      

  9.   

    ? 只用了SetRange SetWindowText SetPos StepIt
    再不能用,给出你们的e-mail整个工程发过去。
      

  10.   

    我的Mail:[email protected]
    多谢了!成功后再送50分!
      

  11.   

    你是不是先在窗体上画一个进度条控件,然后用以下代码获得这个控件
    CTextProgressCtrl *textProgress=(CTextProgress*)GetDlgItem(IDC_PRO);
    最后再使用其中的函数呢?
      

  12.   

    既然要发就顺便给我发一个看看吧,[email protected]
      

  13.   

    西东大哥, 我现在正要做个进度条,正愁于不会做,
    行行好,把你的工程也发给我一份吧,
    不胜感激流泪. [email protected]