看完季后赛第二轮火箭主场和湖人的比赛,意料中的又输了,虽然总是期待着火箭能做成黑马,创造奇迹。
无事打开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