VS2005下windows media player 控件的使用問題(轉載)

来源:互联网 发布:dhc的网络整合营销 编辑:程序博客网 时间:2024/04/29 03:17

最近在做一個有關windows media player 控件的東西,剛開始做的時候,在網上找了很久都沒找到相關的中文文檔。沒辦法,只好自己硬著頭皮慢慢查看MSDN上的有關內容。由於vs2003與vc6有一定的區別,這也是我在查找資料和使用控件時遇到的具到困難,同時也有很多網友遇到了同樣的問題,為了使大家以後在遇到同樣問題是能有個比較有幫助的中文說明,小弟就將自己前段時間總結的東西貢獻出來,希望對各位有所幫助。
 
Windows media player作為MS的官方組件,MSDN上有著比較詳細的英文說明,但是該說明卻並不是那麼讓人一目了然。該文就如何操作該組件的幾個主要接口以及一些基本功能的實現給與詳盡而明白的說明,為使該文儘量簡單易懂,本文給出了用windows media player控件編寫一個簡單播放器的基本步驟。
 
首先,創建一個對話框,然後在資源管理器中右擊對話框,選擇“插入Active控件”—〉選擇windows media player—〉將控件拉到適合大小—〉右擊player控件—〉選擇添加變量(m_avPlayer)。此時添加的變量在VS2003中不在時IWMPPlay4 了,而是COcx。//附COcx1.h
 
右擊類視圖/解決方案—〉添加類—〉選擇“Active中的MFC類”—〉選擇windows media player<1.0>à選擇相應的接口(IWMPMedia IWMPSettings IWMPControls IWMPPlaylist等等)生成類。為圖方便,我將所有接口都生成了相應的類。
為了說明方便,我在對話框中放了幾個按鈕,分別是:打開,播放,暫停,停止,添加。並在對話框右邊添加了一個clistctrl又來顯示播放列表。
然後在對話框頭文件中添加了以下變量:
CWMPControls m_control;
CWMPSettings m_set; 
CWMPPlaylist m_playlist;
CWMPMedia m_media;
COcx1 m_avPlayer;
 
CListCtrl m_listCtrl;
 
一切準備工作就緒,下面就涉及到具體的編程問題了。
media player 的主要功能有:播放控制,屏幕顯示,播放列表,播放列表集,播放信息顯示。
 
         其中播放控制又有:打開,開始,暫停,停止,快速播放,倒退等等。
1.         打開:當選擇一個文件打開是,可以直接使用m_avPlayer.put_URL(fileName);
為打開按鈕添加消息響應函數,在函數中添加如下代碼:
char szFileFilter[]= 
  "Mp3 File(*.mp3)|*.mp3|"
  "MPEG File(*.mpeg)|*.mpeg|"
  "Media File(*.asf)|*.asf|"
  "Video File(*.dat)|*.dat|"
  "MPGA File(*.mpga)|*.mpga|"
  "Wave File(*.wav)|*.wav|"
  "AVI File(*.avi)|*.avi|"
  "Movie File(*.mov)|*.mov|"
  "Mid File(*.mid;*,rmi)|*.mid;*.rmi|"
  "Wma File(*.wma)|*.wma|"
  "All File(*.*)|*.*||";
 CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this);
 if (fileDialog.DoModal() == IDOK)
 {
  CString  fileName=fileDialog.GetPathName();
  m_avPlayer.put_URL(fileName);
 }
這樣當選擇一個播放文件後,media player就會自動播放該文件了。
2.         開始:為了實現播放控制,在OnInitDialog()中添加代碼:
m_control = static_cast<CWMPControls>(m_avPlayer.get_controls());
然後為開始按鈕添加消息響應函數,並在函數中添加代碼:
m_control.play();
3.         暫停:m_control.pause();
4.         停止:m_control.stop();
5.         其他如倒退,快速播放,MSDN上有相應的函數,讀者可依次自行解決。
到此,一個帶有簡單播放控制的播放器就完成。
 
         下麵來實現播放列表。為實現播放列表控制,首先在OnInitDialog()中添加代碼:
//創建一個播放列表
m_playlist = static_cast<CWMPPlaylist>(m_avPlayer.get_currentPlaylist());
然後將打開按鈕的消息響應函數改為:
char szFileFilter[]=
  "Mp3 File(*.mp3)|*.mp3|"
  "MPEG File(*.mpeg)|*.mpeg|"
  "Media File(*.asf)|*.asf|"
  "Video File(*.dat)|*.dat|"
  "MPGA File(*.mpga)|*.mpga|"
  "Wave File(*.wav)|*.wav|"
  "AVI File(*.avi)|*.avi|"
  "Movie File(*.mov)|*.mov|"
  "Mid File(*.mid;*,rmi)|*.mid;*.rmi|"
  "Wma File(*.wma)|*.wma|"
  "All File(*.*)|*.*||";
 CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this);
 if (fileDialog.DoModal() == IDOK)
 {
  CString  fileName=fileDialog.GetPathName();
  //創建一個媒體
  m_media = static_cast<CWMPMedia>(m_avPlayer.newMedia(fileName));
  //將媒體添加到播放列表
  m_playlist.appendItem(m_media);
  //將列表添加到當前列表,以便實現自動播放
  m_avPlayer.put_currentPlaylist(m_playlist);
 
  m_set = (CWMPSettings)m_avPlayer.get_settings();
  //參數true設置自動播放,false不設置自動播放
m_set.put_autoStart(true);
  //將媒體的名字添加到列表控件
  m_listCtrl.InsertItem(0, m_media.get_name());
 }
 
         接著是屏幕顯示控制
m_avPlayer.put_fullScreen(true/false);
 
         使用播放列表自動播放文件,第一步: 需要在播放列表中添加媒體;第二步:將列表設置為當前播放列表;第三步:將播放設置為自動播放。
函數如下:
 //創建媒體
 m_media = static_cast<CWMPMedia>(m_avPlayer.newMedia(fileName));
 //將媒體追加到播放列表
m_playlist.appendItem(m_media);
//將類別設置為當前列表
 m_avPlayer.put_currentPlaylist(m_playlist);
 //設置自動播放
 m_setting.put_autoStart(true);
 
         播放信息的顯示
可以通過CWMPMedia類獲取相關的媒體信息。
獲取播放文件名:media.get_name();
 
         其他,如鼠標,接盤事件響應,可添加相應的消息響應函數
要注意的是,在添加如鼠標一類的消息時,消息函數有個參數如nButton,它的值為1時是單擊鼠標左鍵,2為單擊鼠標右鍵消息,4為單擊鼠標中鍵。等等。

附COcx1.h

 

#pragma once

// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类

// 注意: 不要修改此文件的内容。如果此类由
//  Microsoft Visual C++ 重新生成,您的修改将被改写。

/////////////////////////////////////////////////////////////////////////////
// COcx1 包装类

class COcx1 : public CWnd
{
protected:
 DECLARE_DYNCREATE(COcx1)
public:
 CLSID const& GetClsid()
 {
  static CLSID const clsid
   = { 0x6BF52A52, 0x394A, 0x11D3, { 0xB1, 0x53, 0x0, 0xC0, 0x4F, 0x79, 0xFA, 0xA6 } };
  return clsid;
 }
 virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
      const RECT& rect, CWnd* pParentWnd, UINT nID,
      CCreateContext* pContext = NULL)
 {
  return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID);
 }

    BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
    UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE,
    BSTR bstrLicKey = NULL)
 {
  return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
  pPersist, bStorage, bstrLicKey);
 }

// 属性
public:
enum
{
    wmplcUnknown = 0,
    wmplcClear = 1,
    wmplcInfoChange = 2,
    wmplcMove = 3,
    wmplcDelete = 4,
    wmplcInsert = 5,
    wmplcAppend = 6,
    wmplcPrivate = 7,
    wmplcNameChange = 8,
    wmplcMorph = 9,
    wmplcSort = 10,
    wmplcLast = 11
}WMPPlaylistChangeEventType;
enum
{
    wmposUndefined = 0,
    wmposPlaylistChanging = 1,
    wmposPlaylistLocating = 2,
    wmposPlaylistConnecting = 3,
    wmposPlaylistLoading = 4,
    wmposPlaylistOpening = 5,
    wmposPlaylistOpenNoMedia = 6,
    wmposPlaylistChanged = 7,
    wmposMediaChanging = 8,
    wmposMediaLocating = 9,
    wmposMediaConnecting = 10,
    wmposMediaLoading = 11,
    wmposMediaOpening = 12,
    wmposMediaOpen = 13,
    wmposBeginCodecAcquisition = 14,
    wmposEndCodecAcquisition = 15,
    wmposBeginLicenseAcquisition = 16,
    wmposEndLicenseAcquisition = 17,
    wmposBeginIndividualization = 18,
    wmposEndIndividualization = 19,
    wmposMediaWaiting = 20,
    wmposOpeningUnknownURL = 21
}WMPOpenState;
enum
{
    wmppsUndefined = 0,
    wmppsStopped = 1,
    wmppsPaused = 2,
    wmppsPlaying = 3,
    wmppsScanForward = 4,
    wmppsScanReverse = 5,
    wmppsBuffering = 6,
    wmppsWaiting = 7,
    wmppsMediaEnded = 8,
    wmppsTransitioning = 9,
    wmppsReady = 10,
    wmppsReconnecting = 11,
    wmppsLast = 12
}WMPPlayState;
enum
{
    wmpsdlsDownloading = 0,
    wmpsdlsPaused = 1,
    wmpsdlsProcessing = 2,
    wmpsdlsCompleted = 3,
    wmpsdlsCancelled = 4
}WMPSubscriptionDownloadState;
enum
{
    WMP_WRITENAMES_TYPE_CD_BY_TOC = 0,
    WMP_WRITENAMES_TYPE_CD_BY_CONTENT_ID = 1,
    WMP_WRITENAMES_TYPE_CD_BY_MDQCD = 2,
    WMP_WRITENAMES_TYPE_DVD_BY_DVDID = 3
}WMP_WRITENAMESEX_TYPE;


// 操作
public:

// IWMPPlayer4

// Functions
//

 void close()
 {
  InvokeHelper(0x3, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
 }
 CString get_URL()
 {
  CString result;
  InvokeHelper(0x1, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
  return result;
 }
 void put_URL(LPCTSTR newValue)
 {
  static BYTE parms[] = VTS_BSTR ;
  InvokeHelper(0x1, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
 }
 long get_openState()
 {
  long result;
  InvokeHelper(0x2, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
  return result;
 }
 long get_playState()
 {
  long result;
  InvokeHelper(0xa, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH get_controls()
 {
  LPDISPATCH result;
  InvokeHelper(0x4, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH get_settings()
 {
  LPDISPATCH result;
  InvokeHelper(0x5, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH get_currentMedia()
 {
  LPDISPATCH result;
  InvokeHelper(0x6, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 void put_currentMedia(LPDISPATCH newValue)
 {
  static BYTE parms[] = VTS_DISPATCH ;
  InvokeHelper(0x6, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
 }
 LPDISPATCH get_mediaCollection()
 {
  LPDISPATCH result;
  InvokeHelper(0x8, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH get_playlistCollection()
 {
  LPDISPATCH result;
  InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 CString get_versionInfo()
 {
  CString result;
  InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
  return result;
 }
 void launchURL(LPCTSTR bstrURL)
 {
  static BYTE parms[] = VTS_BSTR ;
  InvokeHelper(0xc, DISPATCH_METHOD, VT_EMPTY, NULL, parms, bstrURL);
 }
 LPDISPATCH get_network()
 {
  LPDISPATCH result;
  InvokeHelper(0x7, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH get_currentPlaylist()
 {
  LPDISPATCH result;
  InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 void put_currentPlaylist(LPDISPATCH newValue)
 {
  static BYTE parms[] = VTS_DISPATCH ;
  InvokeHelper(0xd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
 }
 LPDISPATCH get_cdromCollection()
 {
  LPDISPATCH result;
  InvokeHelper(0xe, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH get_closedCaption()
 {
  LPDISPATCH result;
  InvokeHelper(0xf, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 BOOL get_isOnline()
 {
  BOOL result;
  InvokeHelper(0x10, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH get_Error()
 {
  LPDISPATCH result;
  InvokeHelper(0x11, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 CString get_status()
 {
  CString result;
  InvokeHelper(0x12, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH get_dvd()
 {
  LPDISPATCH result;
  InvokeHelper(0x28, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH newPlaylist(LPCTSTR bstrName, LPCTSTR bstrURL)
 {
  LPDISPATCH result;
  static BYTE parms[] = VTS_BSTR VTS_BSTR ;
  InvokeHelper(0x29, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms, bstrName, bstrURL);
  return result;
 }
 LPDISPATCH newMedia(LPCTSTR bstrURL)
 {
  LPDISPATCH result;
  static BYTE parms[] = VTS_BSTR ;
  InvokeHelper(0x2a, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms, bstrURL);
  return result;
 }
 BOOL get_enabled()
 {
  BOOL result;
  InvokeHelper(0x13, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
  return result;
 }
 void put_enabled(BOOL newValue)
 {
  static BYTE parms[] = VTS_BOOL ;
  InvokeHelper(0x13, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
 }
 BOOL get_fullScreen()
 {
  BOOL result;
  InvokeHelper(0x15, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
  return result;
 }
 void put_fullScreen(BOOL newValue)
 {
  static BYTE parms[] = VTS_BOOL ;
  InvokeHelper(0x15, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
 }
 BOOL get_enableContextMenu()
 {
  BOOL result;
  InvokeHelper(0x16, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
  return result;
 }
 void put_enableContextMenu(BOOL newValue)
 {
  static BYTE parms[] = VTS_BOOL ;
  InvokeHelper(0x16, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
 }
 void put_uiMode(LPCTSTR newValue)
 {
  static BYTE parms[] = VTS_BSTR ;
  InvokeHelper(0x17, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
 }
 CString get_uiMode()
 {
  CString result;
  InvokeHelper(0x17, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
  return result;
 }
 BOOL get_stretchToFit()
 {
  BOOL result;
  InvokeHelper(0x18, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
  return result;
 }
 void put_stretchToFit(BOOL newValue)
 {
  static BYTE parms[] = VTS_BOOL ;
  InvokeHelper(0x18, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
 }
 BOOL get_windowlessVideo()
 {
  BOOL result;
  InvokeHelper(0x19, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
  return result;
 }
 void put_windowlessVideo(BOOL newValue)
 {
  static BYTE parms[] = VTS_BOOL ;
  InvokeHelper(0x19, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
 }
 BOOL get_isRemote()
 {
  BOOL result;
  InvokeHelper(0x1a, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
  return result;
 }
 LPDISPATCH get_playerApplication()
 {
  LPDISPATCH result;
  InvokeHelper(0x1b, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
  return result;
 }
 void openPlayer(LPCTSTR bstrURL)
 {
  static BYTE parms[] = VTS_BSTR ;
  InvokeHelper(0x1c, DISPATCH_METHOD, VT_EMPTY, NULL, parms, bstrURL);
 }

// Properties
//

 

};

其实大家的困惑是COcx1.h这个头文件竟然没有操作的具体代码,只要找到了上面这些代码就搞定了

原创粉丝点击