自定义滑块控件实现

在多媒体流应用中,为了节省窗口空间并防止未缓冲的场景被查看或听到,常常需要一种特殊的控件,它能够将滑块控制和进度条结合在一个窗口中。本文将介绍如何实现这样一个控件,称为CProSliderCtrl类,它利用CSliderCtrl类的自定义绘制功能来实现这一需求。

1.0 版本于2004年首次发布。

1.1 版本更新了项目,使其与最新的Visual Studio 2017兼容。

功能特点

CSliderCtrl类具有以下特点:

  • 标准CSliderCtrl和CProgressCtrl类的所有基本功能。
  • 自定义绘制边框、滑块、通道和进度条。
  • 可以显示或隐藏边框。
  • 可以根据需要更改颜色。
  • 可以禁用(冻结)滑块。
  • 无闪烁的进度条

自定义绘制系统大量使用递归函数来绘制窗口对象,并使用负指数随机数来获得更好的颜色(稍后将进行描述)。递归函数是调用自身的函数,直到控制机制停止递归。下面是一个简单的递归函数原型:

void Recursion(int val) { // 计算内容 val++; if (val <= 255) Recursion(val); return; }

这是计算给定颜色较浅版本的最简单方法,同时也为对象提供了3D外观。可以通过注释掉函数内部的递归行来查看差异。

由于递归绘制函数每次调用自己时都会使颜色变浅,因此使用较深的颜色将得到更好的彩色3D对象。为了在这种递归函数中生成深色,实现了一个负指数随机数(nexp)生成器。下面是一个Matlab模拟函数的示例,输入值为255:

如何使用CProSliderCtrl类

导出的函数如下:

// 获取进度条控件的当前下限和上限,或范围。 void _GetRange(int& nLower, int& nUpper); // 设置进度条控件范围的上下限,并重新绘制条以反映新的范围。 void _SetRange(short nLower, short nUpper); // 设置进度条控件范围的上下限,并重新绘制条以反映新的范围。 void _SetRange32(int nLower, int nUpper); // 设置进度条的背景颜色。 COLORREF _SetBkColor(COLORREF clrNew); // 设置滑块颜色 COLORREF _SetThumbColor(COLORREF clrNew); // 设置通道颜色 COLORREF _SetChColor(COLORREF clrNew); // 获取进度条的当前位置。 int _GetPos(void); // 通过指定的增量推进进度条控件的当前位置,并重新绘制条以反映新的位置。 int _OffsetPos(int nPos); // 设置进度条控件的当前位置,并重新绘制条以反映新的位置。 int _SetPos(int nPos); // 指定进度条控件的步进增量。 int _SetStep(int nStep); // 通过步进增量推进进度条控件的当前位置,并重新绘制条以反映新的位置。 int _StepIt(void); // 冻结/解冻滑块并返回之前的州 BOOL Freeze(void); // 启用/禁用边框 HRESULT _EnableBorders(BOOL bEnable=TRUE); // 测试边框是否启用 BOOL _IsEnabled(void);

CProSliderCtrl类

此类使用函数OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)来处理自定义绘制任务。当系统发送TBCD_CHANNEL消息时,该类将进度条绘制到滑块通道的区域。

如何在应用程序中使用CProSliderCtrl类

只需将类添加到工作区,并定义滑块控件变量如下:

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