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 + -
显示快捷键?