📄 sliderdlg.cpp
字号:
// SliderDlg.cpp : implementation file
//
#include "stdafx.h"
#include "controls.h"
#include "SliderDlg.h"
#include "shlwapi.h"
#include "commctrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSliderDlg property page
IMPLEMENT_DYNCREATE(CSliderDlg, CPropertyPage)
CSliderDlg::CSliderDlg() : CPropertyPage(CSliderDlg::IDD)
{
//{{AFX_DATA_INIT(CSliderDlg)
m_bVertTickMarks = FALSE;
m_bVertAutoTick = FALSE;
m_nVertPoints = 0;
m_bVertEnableSel = FALSE;
m_nVertLowerLimit = 0;
m_nVertUpperLimit = 100;
m_nVertSlider = 0;
m_nVertTickFreq = 2;
m_bHorzAutoTick = FALSE;
m_bHorzEnableSel = FALSE;
m_nHorzLowerLimit = 0;
m_nHorzPoints = 0;
m_nHorzSlider = 0;
m_bHorzTickMarks = FALSE;
m_nHorzUpperLimit = 100;
m_nHorzTickFreq = 1;
//}}AFX_DATA_INIT
m_psp.dwFlags &= ~PSP_HASHELP;
m_nVertSelMin = -1;
m_nVertSelMax = -1;
}
CSliderDlg::~CSliderDlg()
{
}
void CSliderDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSliderDlg)
DDX_Control(pDX, IDC_HORZ_TICKFREQEDIT, m_ctlHorzTickFreq);
DDX_Control(pDX, IDC_HORZ_TICKFREQSPIN, m_ctlHorzTickFreqSpinner);
DDX_Control(pDX, IDC_HORZ_SLIDER, m_ctlHorzSlider);
DDX_Control(pDX, IDC_VERT_SLIDER, m_ctlVertSlider);
DDX_Control(pDX, IDC_VERT_TICKFREQEDIT, m_ctlVertTickFreq);
DDX_Control(pDX, IDC_VERT_TICKFREQSPIN, m_ctlVertTickFreqSpinner);
DDX_Check(pDX, IDC_VERT_TICKMARKS, m_bVertTickMarks);
DDX_Check(pDX, IDC_VERT_AUTOTICK, m_bVertAutoTick);
DDX_Radio(pDX, IDC_VERT_POINTSBOTH, m_nVertPoints);
DDX_Check(pDX, IDC_VERT_ENABLESEL, m_bVertEnableSel);
DDX_Text(pDX, IDC_VERT_LOWEREDIT, m_nVertLowerLimit);
DDX_Text(pDX, IDC_VERT_UPPEREDIT, m_nVertUpperLimit);
DDX_Slider(pDX, IDC_VERT_SLIDER, m_nVertSlider);
DDX_Text(pDX, IDC_VERT_TICKFREQEDIT, m_nVertTickFreq);
DDX_Check(pDX, IDC_HORZ_AUTOTICK, m_bHorzAutoTick);
DDX_Check(pDX, IDC_HORZ_ENABLESEL, m_bHorzEnableSel);
DDX_Text(pDX, IDC_HORZ_LOWEREDIT, m_nHorzLowerLimit);
DDX_Radio(pDX, IDC_HORZ_POINTSBOTH, m_nHorzPoints);
DDX_Slider(pDX, IDC_HORZ_SLIDER, m_nHorzSlider);
DDX_Check(pDX, IDC_HORZ_TICKMARKS, m_bHorzTickMarks);
DDX_Text(pDX, IDC_HORZ_UPPEREDIT, m_nHorzUpperLimit);
DDX_Text(pDX, IDC_HORZ_TICKFREQEDIT, m_nHorzTickFreq);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSliderDlg, CPropertyPage)
//{{AFX_MSG_MAP(CSliderDlg)
ON_BN_CLICKED(IDC_HORZ_ENABLESEL, OnHorzEnablesel)
ON_EN_CHANGE(IDC_HORZ_LOWEREDIT, OnChangeHorzLoweredit)
ON_BN_CLICKED(IDC_HORZ_POINTSBOTH, OnHorzPoints)
ON_BN_CLICKED(IDC_HORZ_TICKMARKS, OnHorzTickmarks)
ON_EN_CHANGE(IDC_HORZ_UPPEREDIT, OnChangeHorzUpperedit)
ON_BN_CLICKED(IDC_HORZ_AUTOTICK, OnHorzAutotick)
ON_EN_CHANGE(IDC_HORZ_TICKFREQEDIT, OnChangeHorzTickfreqedit)
ON_BN_CLICKED(IDC_VERT_ENABLESEL, OnVertEnablesel)
ON_EN_CHANGE(IDC_VERT_LOWEREDIT, OnChangeVertLoweredit)
ON_BN_CLICKED(IDC_VERT_POINTSBOTH, OnVertPoints)
ON_BN_CLICKED(IDC_VERT_TICKMARKS, OnVertTickmarks)
ON_EN_CHANGE(IDC_VERT_UPPEREDIT, OnChangeVertUpperedit)
ON_BN_CLICKED(IDC_VERT_AUTOTICK, OnVertAutotick)
ON_EN_CHANGE(IDC_VERT_TICKFREQEDIT, OnChangeVertTickfreqedit)
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_CLEARVERTSEL, OnClearvertsel)
ON_BN_CLICKED(IDC_SETVERTSEL, OnSetvertsel)
ON_BN_CLICKED(IDC_HORZ_POINTSBOTTOM, OnHorzPoints)
ON_BN_CLICKED(IDC_HORZ_POINTSTOP, OnHorzPoints)
ON_BN_CLICKED(IDC_VERT_POINTSRIGHT, OnVertPoints)
ON_BN_CLICKED(IDC_VERT_POINTSLEFT, OnVertPoints)
ON_NOTIFY(NM_CUSTOMDRAW, IDC_VERT_SLIDER, OnCustomdrawVertSlider)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSliderDlg message handlers
/////////////////////////////////////////////////////////////////////////////
// Functions common to horizontal and vertical sliders
/////////////////////////////////////////////////////////////////////////////
BOOL CSliderDlg::OnInitDialog()
{
CPropertyPage::OnInitDialog();
AdjustSliderRect (m_ctlVertSlider);
AdjustSliderRect (m_ctlHorzSlider);
m_ctlVertSlider.SetSelection (m_nVertLowerLimit, m_nVertUpperLimit);
m_ctlHorzSlider.SetRange (m_nHorzLowerLimit, m_nHorzUpperLimit, TRUE);
m_ctlVertSlider.SetRange (m_nVertLowerLimit, m_nVertUpperLimit, TRUE);
m_ctlVertSlider.SetPos (m_nVertUpperLimit);
m_ctlVertSlider.SetTicFreq (m_nVertTickFreq);
::EnableWindow (GetDlgItem (IDC_CLEARVERTSEL)->m_hWnd, FALSE);
::EnableWindow (GetDlgItem (IDC_SETVERTSEL)->m_hWnd, FALSE);
return TRUE;
}
void CSliderDlg::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)
{
if (!(dwSliderStyle & TBS_NOTICKS))
{
if (!(dwSliderStyle & (TBS_LEFT | TBS_BOTH)))
nExtra += 4;
}
rcSlider.right = rcSlider.left + rcThumb.left + rcThumb.right + nExtra;
}
else
rcSlider.bottom = rcSlider.top + rcThumb.top + rcThumb.bottom + nExtra;
ctlSlider.MoveWindow (&rcSlider, TRUE);
}
/////////////////////////////////////////////////////////////////////////////
// CSliderDlg message handlers
/////////////////////////////////////////////////////////////////////////////
// Horizontal Slider Functions
/////////////////////////////////////////////////////////////////////////////
void CSliderDlg::OnChangeHorzLoweredit()
{
if (m_ctlHorzSlider.m_hWnd == NULL)
return;
int nMin, nMax;
UpdateData (TRUE);
if (m_nHorzLowerLimit >= m_nHorzUpperLimit)
{
nMin = m_ctlHorzSlider.GetRangeMin ();
m_nHorzLowerLimit = nMin;
UpdateData (FALSE);
return;
}
m_ctlHorzSlider.GetRange (nMin, nMax);
m_ctlHorzSlider.SetRange (m_nHorzLowerLimit, nMax, TRUE);
if (m_ctlHorzSlider.GetStyle () & TBS_ENABLESELRANGE)
m_ctlHorzSlider.SetSelection (m_nHorzLowerLimit, m_ctlHorzSlider.GetPos ());
m_ctlHorzSlider.Invalidate ();
}
void CSliderDlg::OnChangeHorzUpperedit()
{
if (m_ctlHorzSlider.m_hWnd == NULL)
return;
int nMin, nMax;
UpdateData (TRUE);
if (m_nHorzUpperLimit <= m_nHorzLowerLimit)
{
nMax = m_ctlHorzSlider.GetRangeMax ();
m_nHorzUpperLimit = nMax;
UpdateData (FALSE);
return;
}
m_ctlHorzSlider.GetRange (nMin, nMax);
m_ctlHorzSlider.SetRange (nMin, m_nHorzUpperLimit, TRUE);
}
void CSliderDlg::OnHorzPoints()
{
UpdateData (TRUE);
switch (m_nHorzPoints)
{
case 0:
m_ctlHorzSlider.ModifyStyle (TBS_BOTTOM | TBS_TOP, TBS_BOTH, TRUE);
break;
case 1:
m_ctlHorzSlider.ModifyStyle (TBS_BOTTOM | TBS_BOTH, TBS_TOP, TRUE);
break;
case 2:
m_ctlHorzSlider.ModifyStyle (TBS_BOTH | TBS_TOP, TBS_BOTTOM, TRUE);
break;
}
}
void CSliderDlg::OnHorzTickmarks()
{
UpdateData (TRUE);
int nMin, nMax;
m_ctlHorzSlider.GetRange (nMin, nMax);
if (m_bHorzTickMarks)
{
if (m_bHorzAutoTick)
{
m_ctlHorzSlider.ModifyStyle (TBS_NOTICKS, 0, TRUE);
m_ctlHorzSlider.SetTicFreq (-1);
}
else
{
m_ctlHorzSlider.ModifyStyle (0, TBS_AUTOTICKS, TRUE);
m_ctlHorzSlider.SetTicFreq (-1);
m_ctlHorzSlider.ModifyStyle (TBS_NOTICKS | TBS_AUTOTICKS, 0, TRUE);
m_ctlHorzSlider.SetTicFreq (m_nHorzTickFreq);
}
}
else
{
m_ctlHorzSlider.ModifyStyle (0, TBS_NOTICKS, TRUE);
}
AdjustSliderRect (m_ctlHorzSlider);
m_ctlHorzSlider.SetRange (nMin, nMax, TRUE);
}
void CSliderDlg::OnHorzAutotick()
{
UpdateData (TRUE);
int nMin, nMax;
m_ctlHorzSlider.GetRange (nMin, nMax);
if (m_bHorzAutoTick)
{
m_ctlHorzSlider.SetTicFreq (-1);
m_ctlHorzSlider.ModifyStyle (0, TBS_AUTOTICKS, TRUE);
m_ctlHorzTickFreq.EnableWindow (FALSE);
m_ctlHorzTickFreqSpinner.EnableWindow (FALSE);
}
else
{
m_ctlHorzSlider.ModifyStyle (TBS_AUTOTICKS, 0, TRUE);
m_ctlHorzSlider.SetTicFreq (m_nHorzTickFreq);
m_ctlHorzTickFreq.EnableWindow (TRUE);
m_ctlHorzTickFreqSpinner.EnableWindow (TRUE);
}
m_ctlHorzSlider.SetRange (nMin, nMax, TRUE);
}
void CSliderDlg::OnHorzEnablesel()
{
UpdateData (TRUE);
if (m_bHorzEnableSel)
{
m_ctlHorzSlider.ModifyStyle (0, TBS_ENABLESELRANGE, TRUE);
m_ctlHorzSlider.SetSelection (m_ctlHorzSlider.GetRangeMin(), m_ctlHorzSlider.GetPos());
}
else
{
m_ctlHorzSlider.ClearSel ();
m_ctlHorzSlider.ModifyStyle (TBS_ENABLESELRANGE, 0, TRUE);
}
m_ctlHorzSlider.Invalidate ();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -