MCI控件   MCI控件是通过多媒体控制接口对多媒体设备进行控制的。它可以播放Windows中媒体播放器所支持的所有格式的媒体文件,比如WAV、MID、AVI等等。   设计和使用MCI控件时常用到它的如下属性(见表1)。 表1 属性名称 何时使用 作用 使用说明 
Visible 设计控
件时用 决定工程运行时该控件是否可见 如果应用程序中多媒体的播放是由程序自动控制的,则应设为False。若为按键控制,则设为True。 
DeviceType 设计代
码时用 设置所要播放的多媒体文件类型 常见的类型有AVIVideo、CDAudio、DAT(数字录音带)、DigitalVideo、MMMovie(多媒体电影)、Overlay、FLI格式、FLC格式、扫描仪、序列发生器、VCR、视盘或 WaveAudio。 
FileName 设计代
码时用 指定要播放的多媒体文件 此处要给出文件名全称,即不但要给出文件名,还要给出文件所在盘符和路径。 
Mode 设计代
码时用 反映多媒体设备当前的状态 通过测试Mode属性的值,我们便可以了解多媒体设备当前的状态,以进行进一步的控制。 
Command 设计代
码时用 指定一个要执行的MCI命令 通过它来向多媒体设备发布命令。 
  使用MCI控件时要注意以下几点:   ·MCI控件可以根据用户给出的多媒体文件的扩展名自动设置设备类型Mode,用户可不设置Mode属性,而让MCI控件自行确定。   ·如果不对MCI控件进行绑定,MCI控件播放视频文件时,MCI控件将使用自己的窗体进行播放。由于MCI控件的播放窗体是浮动的,因此它出现在屏幕上的位置是随机的,如果此时屏幕上还有其它窗体存在,则很可能造成窗口重叠,影响显示效果。所以如果我们能把MCI控件播放的视频内容控制在预先指定的位置上,就可以避免这类事件的发生。   下面通过将MCI控件绑定到PictureBox控件进行显示为例,来介绍绑定的具体实现过程。   (1)首先应分别设计一个MCI控件和一个PictureBox控件,假设它们的名称分别为MCI2和Picture2,将MCI控件的Visible属性设为False(目的是让程序去控制播放),将PictureBox控件调整到指定位置,以便将来在此控件窗口中播放视频文件。   (2)在相应的事件代码中加入如下代码段。   MCI2.filename=″c:\user\demo.avi″(指定要播放的视频文件)   MCI2.hWndDisplay=Picture2.hWnd   (将MCI设备输出窗口的句柄送入PictureBox控件,以实现绑定)   MCI2.Command=″Open″(打开MCI设备)   MCI2.Command=″Play″(开始进行播放)   注意:   ①MCI控件的hWndDisplay属性是为MCI MMMovie或Overlay设备规定显示输出窗口的。该属性是MCI设备输出窗口的句柄。如果句柄为0,则使用缺省窗口。   ②hWnd属性:返回窗体或控件的窗口句柄。   一旦实现了绑定,与MCI控件相绑定的PictureBox控件的窗体就只能用于显示MCI控件播放的视频文件了。如果想在该控件上显示其它信息,就必须首先解除绑定。   前面我们介绍过,如果MCI控件的hWndDisplay属性为0,则MCI控件使用自己的窗口进行播放,这样便可解除绑定。因此用户可在需要解除绑定处安排这样一条语句:MCI2.hWndDisplay=0。绑定的解除工作应放在视频文件停止播放之后进行,否则屏幕会出现一次闪动。   一个小巧且功能完备的多媒体程序   本程序可以在指定位置播放AVI文件,播放既可连续进行,也可以向前、向后逐帧进行,还能按用户要求从指定位置开始播放,到指定位置停止播放,并且可以随时重放;用户可实时了解到媒体设备现在所处状态;如果AVI文件本身还带有声音的话,则本程序可控制是否播放声音。程序运行后的情况如图所示:    (1)所需控件   一个PictureBox控件、七个CommandButton控件、一个CheckBox控件、四个Label控件、两个TextBox控件、一个Timer控件、一个MMControl控件(MCI控件)。   (2)各控件的属性设置(见表2)。 表2 窗体及控件 属性 设置值 含义 
MMControl控件 Visible False 将控件隐藏起来,由程序去控制播放。 
Timer控件 Interval 200 设置每隔0.2秒发生一次Timer1_timer()事件,当然此项设置也可在事件代码中用语句Timer1.Interval=200来设定。 
Label1控件 Caption 从此帧开始: 提示字符串 
Label2控件 Caption 到此帧结束: 提示字符串 
ChechBox控件 Caption 静音 提示字符串 
Font 宋体、12号字 设置显示的字体及字的大小。 

解决方案 »

  1.   

    ----所需物件:PictureBox(1),Label(6),CommandButton(2),CommonDialog(1),MMControl(1)。  ----程式码: Const INTERVAL = 1000 
    Dim CurVal As Double Private Sub CmdEnd_Click() 
       MMControl1.Command = "stop" 
       MMControl1.Command = "close" 
       End 
    End Sub Private Sub CmdOpen_Click() 
       MMControl1.Command = "stop" 
       MMControl1.Command = "close" 
       Close #1 
       On Error GoTo errhandler 
       CMDlg.Filter = "音效档(*.wav;*.mid) |*.wav;*.mid" 
       CMDlg.FilterIndex = 1 
       CMDlg.Action = 1 
       Open CMDlg.filename For Input As #1 
      
       If Right$(CMDlg.filename, 3) = "wav" Then 
          MMControl1.DeviceType = "waveaudio" 
       Else 
          MMControl1.DeviceType = "sequencer" 
       End If 
      
       MMControl1.filename = CMDlg.filename 
       MMControl1.Command = "open" 
       CurVal = 0# 
       MMControl1.UpdateInterval = 0 
    errhandler: 
       Exit Sub 
    End Sub Private Sub Form_Load() 
       Label1.Caption = "音效档名:" 
       Label2.Caption = "总共时间:" 
       Label3.Caption = "目前位置:" 
       MMControl1.UpdateInterval = 0 
    End Sub Private Sub Form_Unload(Cancel As Integer) 
       Const MCI_MODE_NOT_OPEN = 524 
       If Not MMControl1.Mode = MCI_MODE_NOT_OPEN Then 
          MMControl1.Command = "close" 
       End If 
    End Sub Private Sub MMControl1_PauseClick(Cancel As Integer) 
       MMControl1.UpdateInterval = 0 
       CurVal = CurVal 
    End Sub Private Sub MMControl1_PlayClick(Cancel As Integer) 
       MMControl1.UpdateInterval = INTERVAL 
    End Sub Private Sub MMControl1_PrevClick(Cancel As Integer) 
       CurVal = 0# 
    End Sub Private Sub MMControl1_StatusUpdate() 
      
       MMControl1.TimeFormat = 0 
       CurVal = CurVal + MMControl1.UpdateInterval + 54    Now_position = CurVal 
       Now_Min = Int(Now_position / 1000 / 60) 
       Now_Sec = Int(Now_position / 1000) Mod 60 
       Total_Min = Int(MMControl1.Length / 1000 / 60) 
       Total_Sec = Int(MMControl1.Length / 1000) Mod 60 
      
       Label4.Caption = MMControl1.filename 
       Label5.Caption = Format(Total_Min, "00") + ":" + Format(Total_Sec, "00") 
       Label6.Caption = Format(Now_Min, "00") + ":" + Format(Now_Sec, "00")    If MMControl1.PlayEnabled = False And Now_Min = Total_Min And Now_Sec = Total_Sec Then 
          CurVal = 0# 
          MMControl1.UpdateInterval = 0 
          MMControl1.Command = "prev" 
          MMControl1.Command = "stop" 
       End If 
    End Sub Private Sub MMControl1_StopClick(Cancel As Integer) 
       CurVal = 0# 
       MMControl1.UpdateInterval = 0 
       MMControl1.Command = "prev" 
    End Sub