vb6,使用WindowsMediaPlayer控件来编写实现重复播放的功能:窗体中有一个list1控件,在wmp控件载入音频的后,用户对音频进行一些操作,比如拖动进度条,暂停,停止,继续播放等。现在设置两个变量:begintime 和 endtime,分别记录重复播放的开始时间和结束时间。每一对对应的begintime和endtime为一组时间表,记录在list1控件里面。list控件的每一个item就是不同的时间表。现在需要实现的是:
用户载入音频,开始播放时、暂停后继续播放时、拖动进度条完毕之后,这三个点作为begintime
在按暂停的时候那个点为endtime。然后把begintime和endtime记录到list1里面。说得形象一点就是:
1、用户载入一个音频,记下begintime为00:00,用户在01:21的时候按暂停。暂停时记下endtime为01:21.程序就在list1中添加一个item为00:00-01:21的项。2、播放音频时按下了暂停,然后又点了继续播放,继续播放的时间点就作为begintime,直到用户按下暂停才作为endtime。程序记下begintime和endtime,然后添加到list1的新项中。3、用户播放音频时,拖动进度条,不管是往前还是往后。在拖动完毕的那个时间点作为begintime。直到用户按下暂停,那个点作为endtime。程序记下begintime和endtime,然后添加到list1的新项中。共以上三种情况。
然后,还要在用户双击list1里面任意一项时,就播放那一项对应的时间段,也就是从begintime到endtime的时间。好了,说完了。感觉说的好复杂。
请问怎样实现这个功能?不一定要给出代码。提示一下思路也可以。
谢谢咯
我q317911684

解决方案 »

  1.   

    感觉像是一个增强版的复读机哦.好像是listbox+WindowsMediaPlayer做界面?
      

  2.   

    无论是暂停,还是拖动,WMP都会产生相应的事件,在事件中记录一下。
      

  3.   

    1. 载入按钮_Click() 中记录 begintime,
       暂停按钮_Click() 中记录 endtime 并输出2. 播放按钮_Click() 中记录 begintime,
       暂停按钮_Click() 中记录 endtime 并输出2. WindowsMediaPlayer1_PositionChange() 中记录 begintime = TimeSerial(0,0,newPosition),
       暂停按钮_Click() 中记录 endtime 并输出
      

  4.   

    我没有自己加按钮。用的是wmp控件上面的按钮。但是这样没有按钮事件,对吧?好像不能对wmp控件上的按钮事件写代码把?
    我是这样写的:
    ======================================================
    通用申明
    Dim ostate As Integer '不断的记录播放状态,o表示旧状态
    Dim nstate As Integer '不断的记录播放状体,n表示新状态然后用了一个timer1
    Private Sub Timer1_Timer() '播放状态:1=停止,2=暂停,3=播放
    ostate = nstate = 0 '0是未定义
    nstate = WindowsMediaPlayer1.playState
    If nstate <> ostate Then
      If nstate = 2 Then
      endtime = WindowsMediaPlayer1.Controls.currentPositionString
      If begintime <> endtime Then
      List1.AddItem begintime & " - " & endtime
      End If
      End If
      If nstate = 3 Then
      begintime = WindowsMediaPlayer1.Controls.currentPositionString
      End If
    End If
    End Sub
    我的理解是,用一个timer和两个变量来检查播放状态是否改变。每隔10ms检查一次。每隔10ms就把nstate的值传递给ostate,然后nstate赋予新值。然后再来判断nstate和ostate是否相同。若不同,则播放状态改变。
    然后在wmp的另外个事件里面
    Private Sub WindowsMediaPlayer1_PositionChange(ByVal oldPosition As Double, ByVal newPosition As Double)
    begintime = newPosition
    End Sub
    不管往前拖动还是往后拖动,拖动后的位置就是新位置。这样有个问题。
    用WindowsMediaPlayer1.Controls.currentPositionString获得的时间是00:00(00分00秒)的格式
    PositionChange里面newPosition得到的时间值是0.00000000秒的格式。
    请问该怎样转换?
      

  5.   

    是listbox+WindowsMediaPlayer做界面
    WMP的按钮动作好像没有事件吧?
    那些事件的名称代表什么我都不知道呢。
      

  6.   

    研究一下WMP的属性和事件。。
      

  7.   

    Option ExplicitPrivate begintime As String
    Private endtime As StringPrivate Sub Form_Load()
        WindowsMediaPlayer1.URL = "C:\WINDOWS\Media\Windows XP ニッ.wav"
    End SubPrivate Sub WindowsMediaPlayer1_PlayStateChange(ByVal NewState As Long)
        Select Case NewState
            Case wmppsPlaying
                begintime = WindowsMediaPlayer1.Controls.currentPositionString
                If LenB(begintime) = 0 Then
                    begintime = "00:00"
                End If
            
            Case wmppsPaused
                endtime = WindowsMediaPlayer1.Controls.currentPositionString
                List1.AddItem begintime & "-" & endtime
        
        End Select
    End Sub
      

  8.   

    8楼的代码漏掉了一种情况,就是前面的状态是暂停,后面的状态是播放,这种情况,begintime又得从播放的哪一个点开始算了。
    所以我改了下,是这样
    通用申明
    Dim ostate As Integer '²»¶ÏµÄ¼Ç¼²¥·Å״̬
    Dim nstate As Integer '²»¶ÏµÄ¼Ç¼²¥·Å×´Ìå
    Private Sub Timer1_Timer() '²¥·Å״̬£º1=Í£Ö¹£¬2=ÔÝÍ££¬3=²¥·Å
    ostate = nstate
    nstate = WindowsMediaPlayer1.playState
    If (ostate = 2) And (nstate = 3) Then
      begintime = WindowsMediaPlayer1.Controls.currentPositionString
    End If
    Private Sub WindowsMediaPlayer1_PlayStateChange(ByVal NewState As Long)
        Select Case NewState
            Case wmppsPlaying
                begintime = WindowsMediaPlayer1.Controls.currentPositionString
                If LenB(begintime) = 0 Then
                    begintime = "00:00"
                End If
            
            Case wmppsPaused
                endtime = WindowsMediaPlayer1.Controls.currentPositionString
                List1.AddItem begintime & "-" & endtime
                listchange = True
        
        End Select
    End Sub
    Private Sub WindowsMediaPlayer1_PositionChange(ByVal oldPosition As Double, ByVal newPosition As Double)
    begintime = TimeSerial(0, 0, newPosition)
    End Sub
    End Sub