区间滑块控件使用指南

区间滑块控件是一种用户界面组件,允许用户通过滑动操作来选择一个区间。这种控件在Ben Shneiderman的《设计用户界面》一书中有所描述,并且在Spotfire等软件中得到应用。用户可以通过点击和拖动来选择区间,或者通过左右箭头来调整区间的边界。此外,控件还可以显示一个黄色的内部区间,用来表示在其他地方实际显示的值的范围。控件可以水平或垂直使用,并且可以交换左右的意义以增加灵活性。

一般用法

1. 添加源文件

在项目中添加必要的源文件:

  • RangeSlider.h
  • RangeSlider.cpp
  • MemDC.h

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); }

CRangeSlider API

创建窗口

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"的值,反之亦然。

RANGE_CHANGED消息

lParam未使用。在wParam中,将获得一个枚举值:

enum _RangeMessages { RS_LEFTCHANGED, RS_RIGHTCHANGED, RS_BOTHCHANGED, };

指示哪个位置已更改。如果在消息处理程序中调用SetMinMax,可能会向父窗口发送新的RANGE_CHANGED消息,因此要小心避免无限循环和栈溢出。如果调用SetRange,这个消息将不会被发送。通常应该更新显示并设置一个新的“视觉”范围。

待办事项

使所有颜色成为配置选项。

目前整个窗口都被控件填充。它应该限制在合理的深度。

许可证

可以选择使用BSD许可证(无广告条款)或GPL V2或更高版本(请参阅CRangeSlider.cpp)。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485