自己動手寫類似酷狗播放器(3)_Slider控制元件使用

YunShell發表於2013-08-11
     本節總結下音樂播放中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;
			}
上面程式碼包括聲音播放進度功能和聲道音量功能.

相關文章