区间滑块控件是一种用户界面组件,允许用户通过滑动操作来选择一个区间。这种控件在Ben Shneiderman的《设计用户界面》一书中有所描述,并且在Spotfire等软件中得到应用。用户可以通过点击和拖动来选择区间,或者通过左右箭头来调整区间的边界。此外,控件还可以显示一个黄色的内部区间,用来表示在其他地方实际显示的值的范围。控件可以水平或垂直使用,并且可以交换左右的意义以增加灵活性。
1. 添加源文件
在项目中添加必要的源文件:
2. 创建成员变量
在项目的某个类中创建一个成员变量:
CRangeSlider c_RangeSlider;
3. 初始化和创建
在对话框或表单视图模板中添加一个“自定义控件”,使用"MFCRangeSlider"作为窗口类(不带引号)。在类中添加以下代码到DoDataExchange:
DDX_Control(pDX, IDC_YOURID, c_RangeSlider);
在OnInitialUpdate或OnInitDialog中添加代码来初始化控件:
Set Minimum and Maximum.
c_RangeSlider.SetMinMax(m_Min,m_Max);
Set Left and Right Arrows
c_RangeSlider.SetRange(m_Left,m_Right);
Set "Visual" range.
c_RangeSlider.SetVisualMinMax(m_VisualMin, m_VisualMax);
或者可以在OnInitDialog或OnInitialUpdate中创建和定位控件:
CRect rc (
10,
10,
300,
30);
c_RangeSlider.Create(WS_CHILD |WS_VISIBLE|PBS_SMOOTH| WS_TABSTOP ,
rc,
this
, IDC_YOURID);
4. 响应变化
如果用户更改箭头位置,父窗口将收到一个注册的窗口消息RANGE_CHANGED,因此需要在父窗口的消息映射中添加:
ON_REGISTERED_MESSAGE(RANGE_CHANGED, OnRangeChange)
在消息处理程序中读取新位置:
LRESULT CRangeCtrlDlg::OnRangeChange(WPARAM wParam, LPARAM lParam) {
c_RangeSlider.GetRange(m_Left, m_Right);
// Do what you have to do.
...
return static_cast(0);
}
创建窗口
void Create(DWORD dwStyle, const RECT ▭, CWnd *pParentWnd, UINT nID, CCreateContext *pContext = NULL);
在给定位置创建窗口,具有给定的父窗口等(这是所有CWnd::Create-stuff)。
设置和获取滑块的区间[Min, Max]
void SetMinMax(double min, double max);
void GetMinMax(double &min, double &max);
double GetMin(void);
double GetMax(void);
设置或读取滑块左右边缘的值
void SetRange(double left, double right);
double GetLeft(void);
double GetRight(void);
void GetRange(double &left, double &right);
设置箭头的位置
调用后,位置将有效,即如果给定的值left > right,位置将设置为有效位置,或者如果给定的值在[min, max]之外,值将被限制在区间内。读取左右箭头的位置。
设置和读取“视觉”范围的值
void SetVisualMinMax(double VisualMin, double VisualMax);
double GetVisualMinMax(double &VisualMin, double &VisualMax);
double GetVisualMin(void);
double GetVisualMax(void);
设置“视觉”范围的值。如果给定的区间不在[min, max]内,"视觉"范围将被调整。注意必须通过调用SetVisualMode来启用显示。读取“视觉”范围的值。注意必须通过调用SetVisualMode来启用显示“视觉”范围。
设置和读取“视觉模式”的状态
void SetVisualMode(BOOL bVisualMinMax = TRUE);
BOOL GetVisualMode(void);
设置和读取“VisualMode”的状态。切换显示视觉范围。
设置垂直模式
void SetVerticalMode(BOOL bVerticalMode = TRUE);
BOOL GetVerticalMode(void);
如果滑块应该垂直显示(像水平或垂直ProgressCtrl),则设置垂直模式。必须自己处理窗口的位置和方向。
设置反转模式
void SetInvertedMode(BOOL bInvertedMode = TRUE);
BOOL GetInvertedMode(void);
如果设置InvertedMode,控件的左右将被交换。因此,左侧按钮控制"right"的值,反之亦然。
lParam未使用。在wParam中,将获得一个枚举值:
enum _RangeMessages {
RS_LEFTCHANGED,
RS_RIGHTCHANGED,
RS_BOTHCHANGED,
};
指示哪个位置已更改。如果在消息处理程序中调用SetMinMax,可能会向父窗口发送新的RANGE_CHANGED消息,因此要小心避免无限循环和栈溢出。如果调用SetRange,这个消息将不会被发送。通常应该更新显示并设置一个新的“视觉”范围。
使所有颜色成为配置选项。
目前整个窗口都被控件填充。它应该限制在合理的深度。
可以选择使用BSD许可证(无广告条款)或GPL V2或更高版本(请参阅CRangeSlider.cpp)。