滑鼠精確控制CSliderCtrl控制元件的滑塊
最近用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);