No VISUALBAISC5.0, você pode usar o método de reprodução de arquivos de animação de vídeo (*.AVI) para adicionar efeitos de animação ao nosso software, mas como obter o efeito picture-in-picture do vídeo no software? Após a exploração do autor, descobri que esse efeito pode ser alcançado usando as funções API mciExecute, mciSendString e SetWindowPos do WIDOWS95.
Abaixo, o autor toma o método mais comumente usado de sobreposição de uma imagem pequena em uma imagem grande como exemplo para ilustrar o método de implementação de vídeo picture-in-picture.
1. Crie um formulário. Entre no ambiente do sistema VISUALBAISC5.0 e crie um novo formulário FORM1.
2. Crie uma janela de vídeo. Aqui o autor usa duas caixas de imagens (PictureBox), uma grande e outra pequena, como janela de vídeo. Selecione o controle PictureBox na caixa de ferramentas de controle e retire duas caixas (Picture1 e Picture2) no formulário. Entre eles, Picture1 é uma tela grande e reproduz o arquivo AVI01.AVI; Picture2 é uma tela pequena e reproduz o arquivo AVI02.AVI;
3. Escreva o script para o controle correspondente.
Módulos comuns:
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
ATIVAR processo do FORM1:
DimAAAsLong
DimPlayAviAsLong
DimtmpValAsString
DimKeyValSizeAsLong
OnErrorResumePróximo
tmpVal=String$(1024,0)
KeyValSize=1024
PlayAvi=mciSendString("STATUSAVI01READY" Str(Picture2.hwnd),tmpVal,KeyValSize,0)
SePlayAvi<>263Então
PlayAvi=mciExecute("closeAVI01")
FimSe
tmpVal=String$(1024,0)
KeyValSize=1024
PlayAvi=mciSendString("OPENAVI01.AVIALIASAVI01TYPEAVIVIDEOSTYLECHILDPARENT" Str(Picture2.hwnd) "ESPERE",tmpVal,KeyValSize,0)
x1Pos=Imagem1.Largura
y1Pos=Imagem1.Altura
tmpVal=String$(1024,0)
KeyValSize=1024
AA=mciSendString("STATUSAVI01WINDOWHANDLEWAIT",tmpVal,KeyValSize,0)
Se(Asc(Mid(tmpVal,KeyValSize,1))=0)Então
tmpVal = Esquerda (tmpVal, KeyValSize-1)
Outro
tmpVal=Esquerda(tmpVal,KeyValSize)
FimSe
AA=SetWindowPos(tmpVal,0,0,0,x1Pos,y1Pos,0)
AA=mciExecute("WINDOWAVI01STATESHOW")
tmpVal=String$(1024,0)
KeyValSize=1024
PlayAvi=mciSendString("STATUSAVI02READY" Str(Picture1.hwnd),tmpVal,KeyValSize,0)
SePlayAvi<>263Então
PlayAvi=mciExecute("CLOSEAVI02")
FimSe
tmpVal=String$(1024,0)
KeyValSize=1024
PlayAvi=mciSendString("OPENAVI02.AVIALIASAVI02TYPEAVIVIDEOSTYLECHILDPARENT" Str(Picture1.hwnd) "WAIT",tmpVal,KeyValSize,0)
x1Pos=Imagem2.Largura
y1Pos=Imagem2.Altura
tmpVal=String$(1024,0)
KeyValSize=1024
AA=mciSendString("STATUSAVI02WINDOWHANDLEWAIT",tmpVal,KeyValSize,0)
Se(Asc(Mid(tmpVal,KeyValSize,1))=0)Então
tmpVal = Esquerda (tmpVal, KeyValSize-1)
Outro
tmpVal=Esquerda(tmpVal,KeyValSize)
FimSe
AA=SetWindowPos(tmpVal,0,0,0,x1Pos,y1Pos,0)
MciExecute"WINDOWAVI02STATESHOW"
MciExecute"PLAYAVI01REPEAT"
MciExecute"PLAYAVI02REPEAT"
OnErrorGoTo0
Processo QueryUnload do FORM1:
mciExecute"STOPAVI01"
mciExecute"STOPAVI02"
mciExecute"CLOSEAVI01"
mciExecute"CLOSEAVI02"
Ao executar este programa, você pode ver que duas animações são reproduzidas ao mesmo tempo, obtendo o efeito picture-in-picture do vídeo. O programa acima é executado com sucesso em VISUALBAISC5.0 e WINDOWS95. ->