Visual Basic 5.0中實現視頻畫中畫
發表于:2007-07-14來源:作者:點擊數:
標簽:
在VISUAL BAISC 5.0中可以使用播放視頻動畫文件(*.AVI)的方法在我們的軟件中加入動畫效果,但在軟件中如何實現視頻畫中畫的效果呢?經筆者摸索,發現利用WIDOWS 95的API函數mciExecute、mciSendString和SetWindowPos可實現這一效果。 下面筆者以最常用的大
在VISUAL BAISC 5.0中可以使用播放
視頻動畫文件(*.AVI)的方法在我們的軟件中加入動畫效果,但在軟件中如何實現視頻畫中畫的效果呢?經筆者摸索,發現利用WIDOWS 95的API函數mciExecute、mciSendString和SetWindowPos可實現這一效果。
下面筆者以最常用的大畫面中疊加小畫面為例來說明視頻畫中畫的實現方法。
一、建立窗體。進入VISUAL BAISC 5.0系統環境,建立一個新的窗體FORM1。
二、建立視頻窗口。在這里筆者使用了一大一小的兩個圖畫框(PictureBox)作為視頻窗口。選擇控件工具箱中的PictureBox控件,在窗體中拉出兩個方框(Picture1和Picture2)。其中Picture1為大畫面,播放AVI01.AVI文件;Picture2為小畫面,播放AVI02.AVI文件。
三、編寫相應控件的腳本。
通用模塊:
Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String,ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
FORM1的ACTIVATE過程:
Dim AA As Long
Dim PlayAvi As Long
Dim tmpVal As String
Dim KeyValSize As Long
On Error Resume Next
tmpVal = String$(1024, 0)
KeyValSize = 1024
PlayAvi = mciSendString("STATUS AVI01 READY" + Str(Picture2.hwnd),tmpVal, KeyValSize, 0)
If PlayAvi <> 263 Then
PlayAvi = mciExecute("close AVI01")
End If
tmpVal = String$(1024, 0)
KeyValSize = 1024
PlayAvi = mciSendString("OPEN AVI01.AVI ALIAS AVI01 TYPE AVIVIDEO STYLE CHILD PARENT " + Str(Picture2.hwnd) + " WAIT", tmpVal, KeyValSize, 0)
x1Pos = Picture1.Width
y1Pos = Picture1.Height
tmpVal = String$(1024, 0)
KeyValSize = 1024
AA = mciSendString("STATUS AVI01 WINDOW HANDLE WAIT", tmpVal, KeyValSize, 0)
If (Asc(Mid(tmpVal, KeyValSize, 1)) = 0) Then
tmpVal = Left(tmpVal, KeyValSize - 1)
Else
tmpVal = Left(tmpVal, KeyValSize)
End If
AA = SetWindowPos(tmpVal, 0, 0, 0, x1Pos, y1Pos, 0)
AA = mciExecute("WINDOW AVI01 STATE SHOW")
tmpVal = String$(1024, 0)
KeyValSize = 1024
PlayAvi = mciSendString("STATUS AVI02 READY" + Str(Picture1.hwnd), tmpVal, KeyValSize, 0)
If PlayAvi <> 263 Then
PlayAvi = mciExecute("CLOSE AVI02")
End If
tmpVal = String$(1024, 0)
KeyValSize = 1024
PlayAvi = mciSendString("OPEN AVI02.AVI ALIAS AVI02 TYPE AVIVIDEO STYLE CHILD PARENT " + Str(Picture1.hwnd) + " WAIT", tmpVal, KeyValSize, 0)
x1Pos = Picture2.Width
y1Pos = Picture2.Height
tmpVal = String$(1024, 0)
KeyValSize = 1024
AA = mciSendString("STATUS AVI02 WINDOW HANDLE WAIT", tmpVal, KeyValSize, 0)
If (Asc(Mid(tmpVal, KeyValSize, 1)) = 0) Then
tmpVal = Left(tmpVal, KeyValSize - 1)
Else
tmpVal = Left(tmpVal, KeyValSize)
End If
AA = SetWindowPos(tmpVal, 0, 0, 0, x1Pos, y1Pos, 0)
MciExecute "WINDOW AVI02 STATE SHOW"
MciExecute "PLAY AVI01 REPEAT"
MciExecute "PLAY AVI02 REPEAT"
On Error GoTo 0
FORM1的QueryUnload過程:
mciExecute "STOP AVI01"
mciExecute "STOP AVI02"
mciExecute "CLOSE AVI01"
mciExecute "CLOSE AVI02"
運行此程序可見兩個動畫同時播放,實現了視頻畫中畫的效果。以上程序在VISUAL BAISC 5.0及WINDOWS 95中運行通過。
原文轉自:http://www.anti-gravitydesign.com