📄 chap11_6.htm
字号:
<tr>
<td width="33%">
<p align="JUSTIFY">capacility
</td>
<td width="67%">
<p align="JUSTIFY">查询设备能力
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">close
</td>
<td width="67%">
<p align="JUSTIFY">关闭设备
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">info
</td>
<td width="67%">
<p align="JUSTIFY">查询设备的信息
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">open
</td>
<td width="67%">
<p align="JUSTIFY">打开设备
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">pause
</td>
<td width="67%">
<p align="JUSTIFY">暂停设备的播放或记录
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">play
</td>
<td width="67%">
<p align="JUSTIFY">开始设备播放
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">record
</td>
<td width="67%">
<p align="JUSTIFY">开始
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">resume
</td>
<td width="67%">
<p align="JUSTIFY">恢复暂停播放或记录的设备
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">seek
</td>
<td width="67%">
<p align="JUSTIFY">改变媒体的当前位置
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">set
</td>
<td width="67%">
<p align="JUSTIFY">改变设置
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">status
</td>
<td width="67%">
<p align="JUSTIFY">查询设备状态信息
</td>
</tr>
<tr>
<td width="33%">
<p align="JUSTIFY">stop
</td>
<td width="67%">
<p align="JUSTIFY">停止设备的播放或记录
</td>
</tr>
</table>
<p> </p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY"> 例如,上面的例子打开了一个CD播放机后,可以发送常用的命令来控制CD机:</p>
<blockquote>
<blockquote>
<p align="JUSTIFY">play cdaudio from <位置> to <位置>。若省略from则从当前磁道开始播放,若省略to则播放到结束。</p>
<p align="JUSTIFY">pause cdaudio。暂停播放。</p>
<p align="JUSTIFY">stop cdaudio。停止播放。</p>
<p align="JUSTIFY">resume cdaudio。继续被暂停的播放。</p>
<p align="JUSTIFY">status cdaudio number of tracks。查询CD的磁道数。status
cdaudio current track可以查询当前磁道。</p>
<p align="JUSTIFY">seek cdaudio to <位置>。移动到指定磁道。</p>
<p align="JUSTIFY">set cdaudio door open/closed。弹出或缩进CD盘。</p>
<p align="JUSTIFY">close cdaudio。关闭设备。</p>
</blockquote>
</blockquote>
<p> </p>
<p align="JUSTIFY"> MCI设备可以按简单设备和复合设备进行分类。象cdaudio这样的设备不使用文件,我们称之为简单设备,而复合设备在播放时要用到数据文件,如数字视频(digitalvideo)和波形音频(waveaudio)设备,我们把这些数据文件叫做设备元素。</p>
<p align="JUSTIFY"> 在打开一个复合设备时要指定设备名和设备元素。例如,下面命令打开一个波形音频设备:</p>
<p align="JUSTIFY">open mysound.wav type waveaudio</p>
<p align="JUSTIFY"> 可以只为复合设备指定设备元素,例如:</p>
<p align="JUSTIFY">open mysound.wav</p>
<p align="JUSTIFY"> 如下面所示,系统通过查找注册表或WIN.INI的[mci extensions]可以确定打开哪一个设备。</p>
<blockquote>
<p align="JUSTIFY">[mci extensions]</p>
<p align="JUSTIFY">mid=Sequencer</p>
<p align="JUSTIFY">rmi=Sequencer</p>
<p align="JUSTIFY">wav=waveaudio</p>
<p align="JUSTIFY">avi=AVIVideo</p>
</blockquote>
<p align="JUSTIFY"> 有时,程序需要多次打开同一设备来播放不同的数据文件。例如,谁也不能否认在屏幕上同时播放两个AVI文件的可能性,在这种情况下,需要为每次打开的设备起一个不同的别名,这样MCI才能区分两个播放设备。例如,下面这段代码打开并播放了两个AVI文件:</p>
<blockquote>
<p align="JUSTIFY">char buf[50];</p>
<p align="JUSTIFY">mciSendString("open dillo.avi type avivideo
alias dillo",buf,strlen(buf),NULL);</p>
<p align="JUSTIFY">mciSendString("play dillo repeat",buf,strlen(buf),NULL);
//重复播放</p>
<p align="JUSTIFY">mciSendString("open search.avi type avivideo
alias search",buf,strlen(buf),NULL);</p>
<p align="JUSTIFY">mciSendString("play search",buf,strlen(buf),NULL);</p>
</blockquote>
<p align="JUSTIFY">在用open命令打开设备时,如果指定了别名,则以后对该设备的操作都要使用别名。</p>
<p align="JUSTIFY"> 到目前为止,我们使用的都是MCI命令字符串。读者可能己经有了这样的体会,命令字符串具有简单易学的优点,但这种接口与C/C++的风格相去甚远,如果程序要查询和设置大量数据,那么用字符串的形式将很不方便。</p>
<p align="JUSTIFY"> MCI的命令消息接口提供了C语言接口,它速度更快,并且更能符合C/C++程序员的需要。所有MCI命令消息都是通过mciSendCommand函数发送的,该函数的声明为:</p>
<blockquote>
<p align="JUSTIFY">MCIERROR mciSendCommand(</p>
<p align="JUSTIFY">MCIDEVICEID IDDevice, //设备的ID,在打开设备时不用该参数</p>
<p align="JUSTIFY">UINT uMsg, //命令消息</p>
<p align="JUSTIFY">DWORD fdwCommand, //命令消息的标志</p>
<p align="JUSTIFY">DWORD dwParam //指向包含命令消息参数的结构</p>
<p align="JUSTIFY">); //若成功则返回0,否则返回错误码</p>
</blockquote>
<p> </p>
<p align="JUSTIFY">清单11.8的代码演示了用MCI命令消息来打开和重复播放一个AVI文件:</p>
<p align="JUSTIFY"><b> </b></p>
<b>
<p align="JUSTIFY">清单11.8</p>
</b>
<p align="JUSTIFY">MCI_DGV_OPEN_PARMS mciOpen;</p>
<p align="JUSTIFY">UINT wDeviceID;</p>
<p align="JUSTIFY">MCIERROR mciError;</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">mciOpen.lpstrDeviceType = "avivideo"; //设备名</p>
<p align="JUSTIFY">mciOpen.lpstrElementName = "dillo.avi";
//设备元素</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">mciError=mciSendCommand(0, MCI_OPEN, </p>
<p align="JUSTIFY">MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, //使用了设备元素</p>
<p align="JUSTIFY">(DWORD)&mciOpen);</p>
<p align="JUSTIFY">if(mciError)</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">char s[80];</p>
<p align="JUSTIFY">mciGetErrorString(mciError,s,80);</p>
<p align="JUSTIFY">AfxMessageBox(s);</p>
<p align="JUSTIFY">return ;</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY">wDeviceID=mciOpen.wDeviceID; //保存设备ID</p>
<p align="JUSTIFY">MCI_DGV_PLAY_PARMS mciPlay;</p>
<p align="JUSTIFY">mciError=mciSendCommand(wDeviceID, MCI_PLAY, MCI_DGV_PLAY_REPEAT,
</p>
<p align="JUSTIFY">(DWORD)&mciPlay);</p>
<p align="JUSTIFY"><b>. . .</b></p>
<p align="JUSTIFY"> 可以看出,用命令消息比用命令字符串要复杂的多。命令消息与命令字符串是对应的,例如,open与MCI_OPEN完成的是一样的功能。变量wDeviceID用来保存设备的ID,系统用ID来标识不同的设备,以保证命令发给正确的对象。</p>
<p align="JUSTIFY"> 限于篇幅,对MCI的命令消息就不作详细介绍了。</p>
<div align="center">
<center>
<table border="0" cellpadding="0" cellspacing="0" width="615">
<tr>
<td><a href="chap11_5.htm">上一页</a></td>
<td>
<p align="right"><a href="chap11_7.htm">下一页</a>
</td>
</tr>
</table>
<p><a href="http://www.cpcw.com">电脑报首页</a> <a href="../../index.htm">网络学院首页</a></p>
</center>
</div>
<font size="5">
<hr noshade color="#3973DE" size="1">
</font>
<p align="center"><font size="5"></font><font size="2" color="#000000">本教程由<a href="http://vcdynasty.yeah.net">Visual
C++王朝(Where programmers come together)</a>协助制作<br>
未经许可,请勿以任何形式复制</font>
</td>
</tr>
</table>
</center>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -