Заставка с видеофрагментом
Теперь создадим заставку, в которой будет отображаться видеофрагмент (такие заставки нередко используются разработчиками игр и мультимедиа-энциклопедий). С этой целью удалим с формы таймер (он уже не нужен, так как время существования заставки теперь определяется длительностью видеофрагмента), и уничтожим связанный с ним обработчик события OnTimer. Удалим также компонент TImage. Затем добавим компонент TPanel (он будет использоваться в качестве "экрана" для воспроизведения видеофрагмента, и компонент TMediaPlayer. Свойство Visible этого компонента установим равным false, свойство AutoOpen - раным true, а в качестве значения свойства FileName выберем имя файла, содержащего видеофрагмент.
Рис. 6. Форма заставки, воспроизводящей видеофрагмент
Изменим обработчик события, связанного с созданием формы. Теперь мы должны инициировать воспроизведение фрагмента, используя в качестве экрана компонент TPanel. При этом компонент TPanel должен располагаться равноудаленно от левого и правого краев формы и иметь размеры, соответствующие размерам кадров видеофрагмента (их можно узнать, обратившись к свойству DisplayRect компонента TMediaPlayer). В случае Delphi этот обработчик события теперь выглядит так:
procedure TForm2.FormCreate(Sender: TObject); var key,ser,usr:string; Reg:TRegistry; begin try Reg:=TRegistry.Create; key:='SOFTWARE\Splash Screen Company\MyApp\1.0'; Reg.Rootkey:= HKEY_LOCAL_MACHINE; Reg.OpenKey(key,false); usr:=Reg.ReadString('Name'); ser:=Reg.ReadString('Serial'); Label2.Caption:='Пользователь: '+usr; Label3.Caption:='Серийный номер: '+ser; Reg.CloseKey; Reg.Destroy; except Label2.Caption:='Unregistered user'; Label3.Caption:='Please register'; end; MediaPlayer1.DisplayRect:=Rect(Panel1.Left,Panel1.Top,0,0); Panel1.Width:=MediaPlayer1.DisplayRect.Right; Panel1.Height:=MediaPlayer1.Displayrect.Bottom; Panel1.Left:=Round((Form2.Width-Panel1.Width)*0.5); MediaPlayer1.Open; MediaPlayer1.Play; end;
В случае C++Builder соответствующий код имеет вид:
void __fastcall TForm2::FormCreate(TObject *Sender) {TRegistry *Reg; {TRegistry *Reg; try { Reg=new TRegistry; Reg->RootKey=HKEY_LOCAL_MACHINE; AnsiString key="SOFTWARE\\Splash Screen Company\\MyApp\\1.0"; Reg->OpenKey(key,false); AnsiString usr=Reg->ReadString("Name"); AnsiString ser=Reg->ReadString("Serial"); Label2->Caption="Пользователь: "+usr; Label3->Caption="Серийный номер: "+ser; Reg->CloseKey(); Reg->Free(); } catch (...) { Label2->Caption="Unregistered user "; Label3->Caption="Please register "; } MediaPlayer1->DisplayRect=Rect(Panel1->Left,Panel1->Top,0,0); Panel1->Width=MediaPlayer1->DisplayRect.Right; Panel1->Height=MediaPlayer1->DisplayRect.Bottom; Panel1->Left=INT((Form2->Width-Panel1->Width)*0.5); MediaPlayer1->Open(); MediaPlayer1->Play(); }
Обратите внимание: при вычислении координат левого верхнего угла компонента TPanel в приведенных выше обработчиках событий используются функции округления действительных чисел, которые имеют разные названия для Pascal и C++.
Так как мы ликвидировали обработчик события, связанный с компонентом TTimer, наша форма теперь не закроется автоматически. Очевидно, что закрытие формы в данном случае должно быть связано с моментом окончания воспроизведения видеофрагмента. С этой целью воспользуемся событием OnNotify компонента TMediaPlayer, в котором проанализируем его свойство Mode - в момент окончания воспроизведения оно изменится. Соответствующий код для Delphi имеет вид:
procedure TForm2.MediaPlayer1Notify(Sender: TObject); begin Mediaplayer1.Notify := True; if Mediaplayer1.Mode=mpStopped then Form2.Close; end;
Код для C++Builder имеет при этом следующий вид:
void __fastcall TForm1::MediaPlayer1Notify(TObject *Sender) { MediaPlayer1->Notify= true; if (MediaPlayer1->Mode==mpStopped) { Form2->Close(); } }
На этапе выполнения мы получим заставку примерно следующего вида:
Рис. 7. Заставка, воспроизводящая видеофрагмент