在多媒体流应用中,为了节省窗口空间并防止未缓冲的场景被查看或听到,常常需要一种特殊的控件,它能够将滑块控制和进度条结合在一个窗口中。本文将介绍如何实现这样一个控件,称为CProSliderCtrl类,它利用CSliderCtrl类的自定义绘制功能来实现这一需求。
1.0 版本于2004年首次发布。
1.1 版本更新了项目,使其与最新的Visual Studio 2017兼容。
CSliderCtrl类具有以下特点:
自定义绘制系统大量使用递归函数来绘制窗口对象,并使用负指数随机数来获得更好的颜色(稍后将进行描述)。递归函数是调用自身的函数,直到控制机制停止递归。下面是一个简单的递归函数原型:
void Recursion(int val) {
// 计算内容
val++;
if (val <= 255) Recursion(val);
return;
}
这是计算给定颜色较浅版本的最简单方法,同时也为对象提供了3D外观。可以通过注释掉函数内部的递归行来查看差异。
由于递归绘制函数每次调用自己时都会使颜色变浅,因此使用较深的颜色将得到更好的彩色3D对象。为了在这种递归函数中生成深色,实现了一个负指数随机数(nexp)生成器。下面是一个Matlab模拟函数的示例,输入值为255:
导出的函数如下:
// 获取进度条控件的当前下限和上限,或范围。
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);
此类使用函数OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)来处理自定义绘制任务。当系统发送TBCD_CHANNEL消息时,该类将进度条绘制到滑块通道的区域。
只需将类添加到工作区,并定义滑块控件变量如下:
// Pro Slider handle
CProSliderCtrl m_ProSlider;