bmpprogressctr.cpp

来自「深入浅出Visual C++入门进阶与应用实例 随书光盘 作者 何志丹」· C++ 代码 · 共 153 行

CPP
153
字号
// BmpProgressCtr.cpp : implementation file
//

#include "stdafx.h"
#include "Ex040207.h"
#include "BmpProgressCtr.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBmpProgressCtr

CBmpProgressCtr::CBmpProgressCtr()
{
	m_nLower = 0 ; 
	m_nUpper = 100 ; 
	m_nStep	= 10 ;  
	m_nPos = 0 ;   
}

CBmpProgressCtr::~CBmpProgressCtr()
{
}


BEGIN_MESSAGE_MAP(CBmpProgressCtr, CProgressCtrl)
	//{{AFX_MSG_MAP(CBmpProgressCtr)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBmpProgressCtr message handlers

void CBmpProgressCtr::OnPaint() 
{	
	CRect r ;
	GetClientRect(&r);
	
	float lengFore = 0 ;
	if( m_nUpper != m_nLower)
		lengFore =  ((float)( m_nPos - m_nLower ))/ (m_nUpper - m_nLower);

	CPaintDC dc(this); 	
	CDC dcBack,dcFore ;
	{//先画背景
		dcBack.CreateCompatibleDC(&dc);
		dcBack.SelectObject(bmBack);
		dc.StretchBlt(0,0,r.Width(),r.Height(),&dcBack,0,0,bmBackInfo.bmWidth,bmBackInfo.bmHeight,SRCCOPY);
		dcBack.DeleteDC();
	}
	
	{//先前景
		dcFore.CreateCompatibleDC(&dc);	
		dcFore.SelectObject(bmFore);
		dc.StretchBlt(0,0,r.Width()*lengFore,r.Height(),&dcFore,0,0,bmForeInfo.bmWidth*lengFore,bmForeInfo.bmHeight,SRCCOPY);
		dcFore.DeleteDC();
	}	
}


bool CBmpProgressCtr::SetBmpInfo(UINT uForeID, UINT uBackID)
{
	if(!bmBack.LoadBitmap(uBackID))
		return false ;
	if(0 == bmBack.GetBitmap(&bmBackInfo))
		return false ;
	if(!bmFore.LoadBitmap(uForeID))
		return false ;
	if(0 == bmFore.GetBitmap(&bmForeInfo))
		return false ;

	return true ;
}

void CBmpProgressCtr::InvalidatePart()
{
	static int nOldPos = 0 ;
	
	CRect r ;
	GetClientRect(&r);
	r.left		= r.right * (nOldPos - m_nLower)/(m_nUpper - m_nLower ) ;
	r.right		= r.right * (m_nPos - m_nLower)/(m_nUpper - m_nLower ) ;
	InvalidateRect(r);

	nOldPos = m_nPos ;
}

void CBmpProgressCtr::SetRange(int nLower, int nUpper)
{
	m_nLower = min(nLower,nUpper);
	m_nUpper = max(nLower,nUpper);
}

int CBmpProgressCtr::SetPos(int nPos)
{
	int nOldPos = m_nPos ;
	if(m_nLower <= nPos && m_nUpper >= nPos)
		m_nPos = nPos;
	
	InvalidatePart() ;
	
	return m_nPos ;	
}

int CBmpProgressCtr::SetStep(int nStep)
{
	int nOldStep = m_nStep ;
	m_nStep = nStep ;
	return nOldStep ;
}

int CBmpProgressCtr::StepIt()
{
	int nOldPos = m_nPos ;

	m_nPos += m_nStep;
	if(m_nPos>m_nUpper)
		m_nPos = m_nUpper;
	InvalidatePart();

	return nOldPos ;
}

int CBmpProgressCtr::OffsetPos(int nOffPos)
{
	int nOldPos = m_nPos ;

	m_nPos += nOffPos ;
	if(m_nPos > m_nUpper)
		m_nPos = m_nUpper;

	return nOldPos ;
}

int CBmpProgressCtr::GetPos()
{
	return m_nPos;
}

void CBmpProgressCtr::GetRange(int &lower, int &upper)
{
	lower = m_nLower;
	upper = m_nUpper;
}

/////////////////////////////////////////////////////////////////////////////
// CBmpProgressCtr message handlers

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?