看完季後賽第二輪火箭主場和湖人的比賽,意料中的又輸了,雖然總是期待著火箭能做成黑馬,創造奇蹟。
無事開啟csdn看到有個tx提問說vs2003下面在MFC程式中使用wmp控制項的問題,說啥vs2003 2005和以前的
vc6不太相同了,於是就試了下,發現還真的是有些變化。
在vc6下面,直接在MFC工程中插入一個ActiveX組件,然後在為其建立一個控制項類型成員的同時,MFC會為此組件產生很多的相關封裝類,例如,對wmp而言,會產生CWMPPLAYER4 CWMPCONTROL CWMPSETTINGS等等(你可以自己確定是否要產生對應的封裝類)。之後,你就可以利用這些類來控制wmplayer工作了。
在vs2003呢? 按照前面的步驟操作了一下,建立一個MFC 對話方塊,然後在裡頭插入一個wmplayer控制項,緊接著為其添加一個成員變數,發現嚮導自動為其產生一個ocx1的視窗衍生類別(CWnd)的成員。 這個ocx1怎麼用啊,沒有直接將wmp控制項的各個介面給封裝出來啊,難道還是需要我們用原生介面或者用IDispatch介面啊?
後面摸索了一下,發現在vs2003以及後面的版本中產生wraper類的方法。
選中工程,點擊右鍵選擇"添加類",在裡頭選擇"從ActiveX控制項中產生MFc類",之後選擇我們的控制項(從系統當前以及註冊的控制項列表)。這裡我們選中"Windows Media Player"控制項,選擇後下面的左邊會列出wmp的一些介面,選擇左邊的介面,添加到右邊,嚮導就會為此介面產生對應的封裝類。到此應該發現和vc6實際上是一樣的吧。例如這裡我們選擇IWmpPlayer介面,嚮導就會為其封裝為CWMPPlayer4類,然後我們可以為對話方塊中的wmp控制項添加一個控制項成員,設定其類型為CWMPPlayer4,之後就可以用如下代碼進行播放控制了:
CWMPPlayer4 m_player; // dlg標頭檔中定義的成員變數
// 播放檔案
CWMPSettings2 set = m_player.get_settings();
set.put_autoStart(FALSE);
m_player.put_URL(_T("e://testproject//media//昆明湖.mp3"));
// 控制暫停和播放
CWMPControls3 control = m_player.get_controls();
if (m_bPause == true)
{
control.play();
}
else
{
control.pause();
}
m_bPause = !m_bPause;
等等操作......
這裡需要注意一個問題:在前面所說的通過ActiveX建立Mfc類的時候,測試發現,第一個添加的是從Cwnd派生出來的,而後面的是COleDispatchDriver派生出來的。不過也不一定是這樣,我先添加了CWMPPlayer4 CWMPControls2,然後添加CWMPSettings,發現CWMPSettings又是從Cwnd派生的,不過沒關係了,直接修改其基類為COleDispatchDriver,另外稍微修改一下建構函式即可。需要注意的是:對話方塊的wmp控制項其DDX的成員變數需從CWnd派生的類型才行。例如這裡我添加的CWMPPlayer4是從CWnd派生的,所以DDX映射如下:
DDX_Control(pDX, IDC_OCX1, m_player);
最後,發現產生的wrapper基類的問題是ide的一個bug,已經有人提出,應該在orcas beta2中會解決吧,期待。。。
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=291427