最近用MFC写了个音乐播放器,在做通过鼠标点击CSLiderCtrl来控制滑块,调节音量大小的功能,这种效果很容易想象。刚开始学MFC,第一次使用CSLiderCtrl控件,对这个控件不是非常熟,自带的功能里没有找到能满足我需求的,所以自己捉摸了这个方法,跟大家分享下。
以CSliderCtrl为基类派生出一个新类,我命名为CVolSliderCtrl,添加左击消息响应
void CVolSliderCtrl::OnLButtonDown(UINT nFlags, CPoint point)
需要搞清楚两个概念:1.CPoint point 传递的值是相对于CSliderCtrl控件左上角的点的坐标。需要注意的是point.x的起点不是控件的滑动槽为0的地方,而是控件最左边。2.CSliderCtrl的中成员函数有关设置控件滑动槽的范围,或滑块的位置(在MSDN中一般用position表示),我暂且说成是“单位”,并且滑动槽的单位是可以设置的。
先设置滑动槽的range,我音量是256个单位,为了方便我将滑动槽也划分成256个单位,单位划分越多,越细致,滑块的误差就越小,我的滑动槽不大,256个就够了。调用如下两个成员函数,进行初始化。
SetRangeMin(0);
SetRangeMax(255);
现在来处理鼠标单击消息响应函数:
刚才提到了CPoint传递的参数和成员函数position不是同一种度量,起始点不同的,需要进行转换。先确定滑块从0滑到255对应CPoint.x的范围,确定的方法有很多,我的方法是在单击消息响应函数里用 TRACE打印出这个两个值。
结果:滑块 0~255 对应 point.x 4~48
设置代码比较简单,代码如下:
CString str;
double per = 255.0/44.0 ; //point.x range 4~48 44=48-4
int volume = per*(point.x-4); //所占单元数(MAX 255)
CSliderCtrl::SetPos(volume); //设置滑块position
Music.My_SetSFXMasterVolume(volume); //设置音量
str.Format("========point.x=============%d================\n",point.x);
TRACE(str);
str.Format("========volume=============%d================\n",volume);
TRACE(str);