1. 程式人生 > >滑鼠精確控制CSliderCtrl控制元件的滑塊

滑鼠精確控制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);