⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 progressbardlg.cpp

📁 vc的一些原码,对于帮助学习和提高很有帮助
💻 CPP
字号:
// ProgressBarDlg.cpp : implementation file
//

#include "stdafx.h"
#include "controls.h"
#include "ProgressBarDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CProgressBarDlg property page

IMPLEMENT_DYNCREATE(CProgressBarDlg, CPropertyPage)

CProgressBarDlg::CProgressBarDlg() : CPropertyPage(CProgressBarDlg::IDD)
{
	//{{AFX_DATA_INIT(CProgressBarDlg)
	m_bProgBarVertical = FALSE;
	m_bProgBarSmooth = FALSE;
	m_bProgBarBorder = FALSE;
	m_nRangeMax = 100;
	m_nRangeCur = 0;
	m_nRangeMin = 0;
	m_nStep = 1;
	m_nProgBarSlider = 0;
	//}}AFX_DATA_INIT
	m_psp.dwFlags &= ~PSP_HASHELP;
}

CProgressBarDlg::~CProgressBarDlg()
{
}

void CProgressBarDlg::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CProgressBarDlg)
	DDX_Control(pDX, IDC_SPIN_MIN, m_ctlSpinMin);
	DDX_Control(pDX, IDC_SPIN_MAX, m_ctlSpinMax);
	DDX_Control(pDX, IDC_SPIN_CURVAL, m_ctlSpinCur);
	DDX_Control(pDX, IDC_PROGBAR_SAMPLE, m_ctlProgBarSample);
	DDX_Control(pDX, IDC_PROGBAR_SLIDER, m_ctlProgBarSlider);
	DDX_Check(pDX, IDC_PROGBAR_VERTICAL, m_bProgBarVertical);
	DDX_Check(pDX, IDC_PROGBAR_SMOOTH, m_bProgBarSmooth);
	DDX_Check(pDX, IDC_PROGBAR_BORDER, m_bProgBarBorder);
	DDX_Slider(pDX, IDC_PROGBAR_SLIDER, m_nProgBarSlider);
	DDX_Text(pDX, IDC_PROGBAR_RANGEMAX, m_nRangeMax);
	DDX_Text(pDX, IDC_PROGBAR_RANGECUR, m_nRangeCur);
	DDX_Text(pDX, IDC_PROGBAR_RANGEMIN, m_nRangeMin);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CProgressBarDlg, CPropertyPage)
	//{{AFX_MSG_MAP(CProgressBarDlg)
	ON_BN_CLICKED(IDC_PROGBAR_VERTICAL, OnProgbarVertical)
	ON_BN_CLICKED(IDC_PROGBAR_SMOOTH, OnProgbarSmooth)
	ON_BN_CLICKED(IDC_PROGBAR_BORDER, OnProgbarBorder)
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_EN_CHANGE(IDC_PROGBAR_RANGEMAX, OnChangeProgbarRangemax)
	ON_EN_CHANGE(IDC_PROGBAR_RANGEMIN, OnChangeProgbarRangemin)
	ON_EN_CHANGE(IDC_PROGBAR_RANGECUR, OnChangeProgbarRangecur)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CProgressBarDlg message handlers

BOOL CProgressBarDlg::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();

	m_ctlProgBarSample.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlProgBarSlider.SetRange (m_nRangeMin, m_nRangeMax);
	m_ctlSpinMin.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlSpinMax.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlSpinCur.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlProgBarSample.SetPos (m_nRangeCur);
	m_ctlProgBarSlider.SetPos (m_nRangeMax);
	m_dwProgBarStyle = m_ctlProgBarSample.GetStyle ();
	AdjustSliderRect (m_ctlProgBarSlider);
	return TRUE;
}

void CProgressBarDlg::OnProgbarVertical() 
{
	UpdateData (TRUE);
	if (m_bProgBarVertical)
	{
		m_dwProgBarStyle |= PBS_VERTICAL;
	}
	else
	{
		m_dwProgBarStyle &= ~PBS_VERTICAL;
	}
	RecreateProgBar (true);
}

void CProgressBarDlg::OnProgbarSmooth() 
{
	UpdateData (TRUE);
	if (m_bProgBarSmooth)
	{
		m_dwProgBarStyle |= PBS_SMOOTH;
	}
	else
	{
		m_dwProgBarStyle &= ~PBS_SMOOTH;
	}
	RecreateProgBar ();
}

void CProgressBarDlg::OnProgbarBorder() 
{
	UpdateData (TRUE);
	if (m_bProgBarBorder)
	{
		m_dwProgBarStyle |= WS_BORDER;
	}
	else
	{
		m_dwProgBarStyle &= ~WS_BORDER;
	}
	RecreateProgBar ();
}

void CProgressBarDlg::RecreateProgBar(bool bOrientation)
{
	CRect rc;
	m_ctlProgBarSample.GetWindowRect (&rc);
	ScreenToClient (&rc);
	int nUpper, nLower;
	m_ctlProgBarSample.GetRange (nLower, nUpper);
	int nPos = m_ctlProgBarSample.GetPos ();
	m_ctlProgBarSample.DestroyWindow ();
	CRect rcNew = rc;
	if (bOrientation)
	{
		CPoint ptMid;
		ptMid.x = rc.left + (rc.right - rc.left) / 2;
		ptMid.y = rc.top + (rc.bottom - rc.top) / 2;
		if (m_dwProgBarStyle & PBS_VERTICAL)
		{
			int nHeight = rc.right - rc.left;
			int nWidth = rc.bottom - rc.top;
			rcNew.top = ptMid.y - nHeight / 2;
			rcNew.bottom = ptMid.y + nHeight / 2;
			rcNew.left = ptMid.x - nWidth / 2;
			rcNew.right = ptMid.x + nWidth / 2;
		}
		else
		{
			int nHeight = rc.right - rc.left;
			int nWidth = rc.bottom - rc.top;
			rcNew.top = ptMid.y - nHeight / 2;
			rcNew.bottom = ptMid.y + nHeight / 2;
			rcNew.left = ptMid.x - nWidth / 2;
			rcNew.right = ptMid.x + nWidth / 2;
		}
	}
	m_ctlProgBarSample.Create (m_dwProgBarStyle, rcNew, this, IDC_PROGBAR_SAMPLE);
	m_ctlProgBarSample.SetRange32 (nLower, nUpper);
	m_ctlProgBarSlider.SetRange (nLower, nUpper);
	m_ctlProgBarSample.SetPos (nPos);
}

void CProgressBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{

	CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CProgressBarDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	UpdateData (TRUE);
	if (pScrollBar == (CScrollBar *) &m_ctlProgBarSlider)
	{
		int nPos = m_nProgBarSlider;
		int nLower, nUpper;
		m_ctlProgBarSample.GetRange (nLower, nUpper);
		int nActual = nLower + nUpper - nPos;
		m_ctlProgBarSample.SetPos (nActual);
		m_nRangeCur = nActual;
		UpdateData (FALSE);
		return;
	}
	CPropertyPage::OnVScroll(nSBCode, nPos, pScrollBar);
}

//
//	The following three functions get called even
//	before the dialog box is created. Test whether
//	the progress bar window is NULL, and return
//	if so.
//
void CProgressBarDlg::OnChangeProgbarRangemax() 
{
	if (m_ctlProgBarSample.m_hWnd == NULL)
		return;
	int nRangeOld = m_nRangeMax;
	UpdateData (TRUE);
	int nLower, nUpper;
	m_ctlProgBarSample.GetRange (nLower, nUpper);
	if (m_nRangeMax <= nLower)
	{
		m_nRangeMax = nRangeOld;
		UpdateData (FALSE);
		return;
	}
	m_ctlProgBarSample.SetRange32 (nLower, m_nRangeMax);
	m_ctlProgBarSlider.SetRange (nLower, m_nRangeMax);
	m_nProgBarSlider = nLower + nUpper - m_nRangeCur;
	if (m_nRangeMax < m_nRangeCur)
	{
		m_nRangeCur = m_nRangeMax;
		m_ctlProgBarSample.SetPos (m_nRangeMax);
	}
	m_ctlSpinMin.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlSpinMax.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlSpinCur.SetRange32 (m_nRangeMin, m_nRangeMax);
	UpdateData (FALSE);
}

void CProgressBarDlg::OnChangeProgbarRangemin() 
{
	if (m_ctlProgBarSample.m_hWnd == NULL)
		return;
	int nRangeOld = m_nRangeMin;
	UpdateData (TRUE);
	int nLower, nUpper;
	m_ctlProgBarSample.GetRange (nLower, nUpper);
	if (m_nRangeMin >= nUpper)
	{
		m_nRangeMin = nRangeOld;
		UpdateData (FALSE);
		return;
	}
	m_ctlProgBarSample.SetRange32 (m_nRangeMin, nUpper);
	m_ctlProgBarSlider.SetRange (m_nRangeMin, nUpper);
	m_nProgBarSlider = nLower + nUpper - m_nRangeCur;
	if (m_nRangeMin > m_nRangeCur)
	{
		m_nRangeCur = m_nRangeMin;
		m_ctlProgBarSample.SetPos (m_nRangeMin);
	}
	m_ctlSpinMin.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlSpinMax.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlSpinCur.SetRange32 (m_nRangeMin, m_nRangeMax);
	UpdateData (FALSE);
}

void CProgressBarDlg::OnChangeProgbarRangecur() 
{
	if (m_ctlProgBarSample.m_hWnd == NULL)
		return;
	int nRangeOld = m_nRangeCur;
	UpdateData (TRUE);
	int nLower, nUpper;
	m_ctlProgBarSample.GetRange (nLower, nUpper);
	if (m_nRangeCur < nLower)
	{
		m_nRangeCur = nRangeOld;
		UpdateData (FALSE);
		return;
	}
	if (m_nRangeCur > nUpper)
	{
		m_nRangeCur = nRangeOld;
		UpdateData (FALSE);
		return;
	}
	m_ctlProgBarSample.SetPos (m_nRangeCur);
	m_nProgBarSlider = nLower + nUpper - m_nRangeCur;
	m_ctlSpinMin.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlSpinMax.SetRange32 (m_nRangeMin, m_nRangeMax);
	m_ctlSpinCur.SetRange32 (m_nRangeMin, m_nRangeMax);
	UpdateData (FALSE);
}

void CProgressBarDlg::AdjustSliderRect(CSliderCtrl &ctlSlider)
{
	int nExtra = 0;
	DWORD dwSliderStyle = ctlSlider.GetStyle ();
	DWORD dwSliderStyleEx = ctlSlider.GetExStyle ();
//
//	If the control has a border or edge, give it a bit extra
//	on the right or bottom to account for the edge.
//
	if ((dwSliderStyle & WS_BORDER) ||
		(dwSliderStyleEx & (WS_EX_CLIENTEDGE | WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME)))
		nExtra = 4;

	CRect rcThumb, rcSlider;
	ctlSlider.GetThumbRect (&rcThumb);
	ctlSlider.GetWindowRect (&rcSlider);
	ScreenToClient (&rcSlider);
	if (dwSliderStyle & TBS_VERT)
	{
		rcSlider.right = rcSlider.left + rcThumb.left + rcThumb.right + nExtra;
	}
	else
		rcSlider.bottom = rcSlider.top + rcThumb.top + rcThumb.bottom + nExtra;
	ctlSlider.MoveWindow (&rcSlider, TRUE);
}

⌨️ 快捷键说明

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