分享
 
 
 

能显示文字的进度条

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

//原著:Chris Maunder

//译者:重庆大学光电学院 贾旭滨(daixi1703163@163.net)

//欢迎大家批评指教,谢谢!

这是一个比较简单的有关于进度条控制的类,它在进度框中能够显示文件名和百分比,我想读者肯定在装软件的时候看到过。这个类最重要的功能就是允许在进度条中显示文字,如下:

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 (chrismaunder@codeguru.com)

// 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 (chrismaunder@codeguru.com)

// Copyright 1998.

//

// Modified : 26/05/98 Jeremy Davis, jmd@jvf.co.uk

// 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

// 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: keithr@europa.com

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

}

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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有