本節總結下音樂播放中slider控制元件的使用,包括兩個方面,slider控制播放時間和控制播放聲音(這裡不是系統的音量)而是聲道的音量.
目標:1.通過播放進度條來控制播放進度
2.通過聲音進度條來控制聲音大小
1.如何操作一個進度條
其實操作一個進度條非常簡單,就是向該進度條控制元件傳送命令即可。
步驟:(1).設定進度條的範圍大小,最小值為都少,最大值為多少
(2).然後就向進度條傳送命令,告訴其顯示的位置,或者獲取它的當前位置
下面的例子顯示瞭如何設定進度條兩端的範圍和設定和獲取位置。
SendDlgItemMessage(hwnd,IDC_SLIDER_SONG,TBM_SETRANGE,TRUE,MAKELPARAM(0,dwsonglen));//設定Silder的兩端範圍 0~dwsonglen
SendDlgItemMessage(hwnd,IDC_SLIDER_SONG,TBM_SETPOS,TRUE,0);//設定當前進度為0,最後一個引數為設定的大小
SendDlgItemMessage(hwnd,IDC_SLIDER_SONG,TBM_GETPOS,0,0); //獲取當前進度條的位置
都是用SendMessage來操作進度條的。
2.當進度條發生移動時候,如何觸發操作?
在播放進度條中,我們希望使用者可以自己快進或者後退。如何實現呢?這裡主要用到一個事件,WM_HSCROLL(水平變化時),進度條可以是水平的,也可以垂直的,比如我們的系統音量。這裡我們的都是用水平樣式的,所以就選擇該事件,也就是說,當進度條發生操作的時候,就會產生這個事件,我們要做的就是在主視窗處理函式(slider控制元件所在的視窗)中,處理該事件即可:這時候要查詢MSDN上關於WM_HSCROLL事件其他兩個引數的意義。
WPARAM wParam, // request and position
LPARAM lParam // handle to scroll bar (HWND) slider的控制元件控制程式碼
然後處理: a.獲取當前的位置
b.將其轉化為時間格式
c.然後設定mciplay.dwFrom欄位,就是要從哪個位置開始播放。
d.mciSendCommand播放即可。
設定播放裝置音量也是一樣,waveOutSetVolume,waveOutGetVolume兩個API來實現的,具體的邏輯可MSDN。
下面的程式碼是播放器這個模組的:
case WM_HSCROLL: //當slider發生滑鼠移動時候
{
if((HWND)lParam==hslider_song) //lParam返回的是滑塊的控制程式碼 這樣可以避免兩個滑塊之間的影響
{
icount=SendDlgItemMessage(hwnd,IDC_SLIDER_SONG,TBM_GETPOS,0,0); //獲取slider位置
mciseek.dwTo=icount*1000; //注意這裡要乘以1000回去啊 單位是MS級別的
mciSendCommand(DeviceId,MCI_SEEK,MCI_WAIT|MCI_TO,(DWORD)(LPMCI_SEEK_PARMS)&mciseek);//跳轉但不播放
mciplay.dwFrom=icount*1000; //更新播放程式
mciSendCommand(DeviceId,MCI_PLAY,MCI_NOTIFY|MCI_FROM,(DWORD)(LPMCI_PLAY_PARMS)&mciplay);//繼續播放
}
if((HWND)lParam==hslider_vol) //聲音音量的調節
{
DWORD volpos=SendDlgItemMessage(hwnd,IDC_SLIDER_VOL,TBM_GETPOS,0,0)*0XFF; //獲取slider的大小
leftVol=RightVol=(WORD)volpos;
dwVol=MAKELONG(leftVol,RightVol); //左聲道是低16位 右聲道是高16位
waveOutSetVolume(0,dwVol);
}
break;
}
上面程式碼包括聲音播放進度功能和聲道音量功能.