📄 progressbardlg.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 + -