VISUALBAISC5.0 では、ビデオ アニメーション ファイル (*.AVI) を再生する方法を使用して、ソフトウェアにアニメーション効果を追加できますが、ソフトウェアでビデオ ピクチャ イン ピクチャ効果を実現するにはどうすればよいでしょうか?著者が調べた結果、WIDOWS95 の API 関数 mciExecute、mciSendString、SetWindowPos を使用することでこの効果を実現できることがわかりました。
以下では、大きな画像の上に小さな画像を重ね合わせる最も一般的に使用される方法を例として、ビデオ ピクチャ イン ピクチャの実装方法を説明します。
1. フォームを作成します。 VISUALBAISC5.0 システム環境に入り、新しいフォーム FORM1 を作成します。
2. ビデオウィンドウを作成します。ここで著者は、大小の 2 つのピクチャ ボックス (PictureBox) をビデオ ウィンドウとして使用しています。コントロール ツールボックスで PictureBox コントロールを選択し、フォーム内で 2 つのボックス (Picture1 と Picture2) を引き出します。このうち、Picture1 は大画面で AVI01.AVI ファイルを再生し、Picture2 は小画面で AVI02.AVI ファイルを再生します。
3. 対応するコントロールのスクリプトを作成します。
共通モジュール:
DeclareFunctionmciExecuteLib"winmm.dll"(ByVallpstrCommandAsString)AsLong
DeclareFunctionmciSendStringLib"winmm.dll"Alias"mciSendStringA"(ByVallpstrCommandAsString,ByVallpstrReturnStringAsString,ByValuReturnLengthAsLong,ByValhwndCallbackAsLong)AsLong
DeclareFunctionSetWindowPosLib"user32"(ByValhwndAsLong,ByValhWndInsertAfterAsLong,ByValxAsLong,ByValyAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsAsLong)AsLong
FORM1 の ACTIVATE プロセス:
ディムAAAsロング
DimPlayAviAsLong
DimtmpValAsString
DimKeyValSizeAsLong
エラー発生時再開次へ
tmpVal=文字列$(1024,0)
KeyValSize=1024
PlayAvi=mciSendString("STATUSAVI01READY" Str(Picture2.hwnd),tmpVal,KeyValSize,0)
IfPlayAvi<>263Then
PlayAvi=mciExecute("closeAVI01")
EndIf
tmpVal=文字列$(1024,0)
KeyValSize=1024
PlayAvi=mciSendString("OPENAVI01.AVIALIASAVI01TYPEAVIVIDEOSTYLECHILDPARENT" Str(Picture2.hwnd) "WAIT",tmpVal,KeyValSize,0)
x1Pos=画像1.幅
y1Pos=画像1.高さ
tmpVal=文字列$(1024,0)
KeyValSize=1024
AA=mciSendString("STATUSAVI01WINDOWHANDLEWAIT",tmpVal,KeyValSize,0)
If(Asc(Mid(tmpVal,KeyValSize,1))=0)Then
tmpVal=Left(tmpVal,KeyValSize-1)
それ以外
tmpVal=Left(tmpVal,KeyValSize)
EndIf
AA=SetWindowPos(tmpVal,0,0,0,x1Pos,y1Pos,0)
AA=mciExecute("WINDOWAVI01STATESHOW")
tmpVal=文字列$(1024,0)
KeyValSize=1024
PlayAvi=mciSendString("STATUSAVI02READY" Str(Picture1.hwnd),tmpVal,KeyValSize,0)
IfPlayAvi<>263Then
PlayAvi=mciExecute("CLOSEAVI02")
EndIf
tmpVal=文字列$(1024,0)
KeyValSize=1024
PlayAvi=mciSendString("OPENAVI02.AVIALIASAVI02TYPEAVIVIDEOSTYLECHILDPARENT" Str(Picture1.hwnd) "WAIT",tmpVal,KeyValSize,0)
x1Pos=画像2.幅
y1Pos=画像2.高さ
tmpVal=文字列$(1024,0)
KeyValSize=1024
AA=mciSendString("STATUSAVI02WINDOWHANDLEWAIT",tmpVal,KeyValSize,0)
If(Asc(Mid(tmpVal,KeyValSize,1))=0)Then
tmpVal=Left(tmpVal,KeyValSize-1)
それ以外
tmpVal=Left(tmpVal,KeyValSize)
EndIf
AA=SetWindowPos(tmpVal,0,0,0,x1Pos,y1Pos,0)
MciExecute「WINDOWAVI02STATESHOW」
MciExecute「PLAYAVI01REPEAT」
MciExecute「PLAYAVI02REPEAT」
OnErrorGoTo0
FORM1のQueryUnload処理:
mci「STOPAVI01」を実行
mci「STOPAVI02」を実行
mci「CLOSEAVI01」を実行
mci「CLOSEAVI02」を実行
このプログラムを実行すると、2 つのアニメーションが同時に再生され、ビデオのピクチャ イン ピクチャ効果が実現されることがわかります。上記のプログラムは VISUALBAISC5.0 および WINDOWS95 で正常に動作します。 ->