Tutorial 2 - Odtwarzacz
animacji AviPlayer wersja 2.0
Po napisaniu drugiej wersji AviPlayera doszed│em
do wniosku, ┐e najlepiej bΩdzie zacz▒µ j▒ pisaµ
od nowa.
PracΩ nad nasz▒ aplikacj▒ zaczynamy od
utworzenia na dysku katalogu AviPlayer2,
uruchomienia Borland C++ Buildera i wybrania
polecenia z menu File->New Application.
Poleceniem File->SaveAll zapisujemy plik
formularza (Unit) jako FormMain.cpp, a plik projektu
(Project) jako AviPlayer2.bpr. Ustawiamy w│a╢ciwo╢ci
formularza:
- BorderIcons->biMaximize = false
- BorderStyle = bsSingle
- Caption = AviPlayer 2.0
- ClientHeight = 264
- ClientWidth = 283
- Name = MainForm
- Position = poScreenCenter
Ustawiamy ikonΩ aviplayer2.ico jako ikonΩ
programu (Ctrl+Shift+F11, zak│adka Application,
przycisk Load Icon...)
Teraz umie╢cimy na formularzu kilka komponent≤w.
Pierwszym z nich jest ToolBar (pasek narzΩdzi) z
zak│adki Win32. Aby utworzyµ na nim przyciski
klikamy prawym klawiszem myszy w jego obszarze i
wybieramy New Button, mo┐emy utworzyµ tak┐e odstΩpy
miΩdzy przyciskami wybieraj▒c New Separator.
Tworzymy na nim: , Separator, Button, Separator,
Button, Button, Button, Separator i Button. Nazywamy
kolejne utworzone przyciski ExitToolButton,
OpenToolButton, PlayToolButton, PauseToolButton,
StopToolButton, InfoToolButton. Zmieniamy w│a╢ciwo╢ci
ToolBar:
- EdgeBorders->ebBottom = true
- Flat = true
- Height = 26
- Name = ToolBar
Znaczenie w│a╢ciwo╢ci:
- EdgeBorders ustawia wy╢wietlanie krawΩdzi
paska narzΩdzi (ebBottom - dolna krawΩd╝)
- Flat ustawia wygl▒d przycisk≤w (nie
maj▒ obramowania, pokazuje siΩ ono po
najechaniu mysz▒ na przycisk)
NastΩpnie z zak│adki Win32 umieszczamy na
formularzu dwa komponenty ImageList, s│u┐▒ one do
przechowywania obrazk≤w. Pierwszy ImageList
(zmieniamy jego w│a╢ciwo╢µ Name = ToolBarImages)
bΩdzie zawiera│ obrazki wy╢wietlane na pasku, a
drugi (Name = ToolBarHotImages) obrazki wy╢wietlane
na pasku po najechaniu na niego mysz▒.
Klikamy dwukrotnie na ToolBarImages i otwiera siΩ
nam okno wyboru obrazk≤w. Za pomoc▒ przycisku Add...
dodajemy po kolei ikony (ikony dostΩpne s▒ po ╢ci▒gniΩciu
Plik≤w do projektu w prawym g≤rnym rogu strony):
- exit.bmp
- open.bmp
- play.bmp
- pause.bmp
- stop.bmp
- info.bmp
Klikamy dwukrotnie na ToolBarHotImages i dodajemy
po kolei ikony:
- exithot.bmp
- openhot.bmp
- playhot.bmp
- pausehot.bmp
- stophot.bmp
- infohot.bmp
Zmieniamy w│a╢ciwo╢ci ToolBar, aby wy╢wietla│
obrazki:
- Images = ToolBarImages
- HotImages = ToolBarHotImages
Znaczenie w│a╢ciwo╢ci:
- Images zawiera nazwΩ komponentu
ImageList zawieraj▒cym obrazki, kt≤re bΩd▒
wy╢wietlone na przyciskach paska narzΩdzi
- HotImages zawiera nazwΩ komponentu
ImageList zawieraj▒cym obrazki, kt≤re bΩd▒
wy╢wietlone na przyciskach paska narzΩdzi po
najechaniu na nie mysz▒
Mo┐emy teraz uruchomiµ program (F9) i
sprawdzamy jak wygl▒da nasze menu. Je╢li kto╢
chce mo┐e zaprojektowaµ swoje w│asne ikony do
przycisk≤w. Dodajemy do programu komponent Bevel z
palety Additional. Komponent ten nic nie robi, s│u┐y
tylko jako "ozdoba" w programie. U nas bΩdzie
stanowi│ ramkΩ dla panelu, na kt≤rym bΩdzie wy╢wietlana
animacja:
- Height = 201
- Left = 0
- Name = EkranBevel
- Shape = bsFrame
- Top = 32
- Width = 204
Teraz umieszczamy komponent Panel (zak│adka
Standard), zmieniamy w│a╢ciwo╢ci:
- BorderStyle = bsSingle
- Caption = kasujemy zawarto╢µ
- Color = clNavy
- Height = 197
- Name = EkranPanel
- Width = 200
Aby wy╢rodkowaµ EkranPanel wzglΩdem EkranBevel,
zaznaczamy klikniΩciem EkranBevel, nastΩpnie
trzymaj▒c wci╢niΩty klawisz Ctrl zaznaczamy
EkranPanel. Oba komponenty teraz s▒ zaznaczone.
Klikamy na kt≤rym╢ z nich prawym przyciskiem myszy
i wybieramy Align, nastΩpnie w lewej i prawej
kolumnie wybieramy Centers i zatwierdzamy OK.
Spowoduje to wy╢rodkowanie EkranPanel wzglΩdem
EkranBevel.
Z zak│adki Additional dodajemy komponent BitBtn,
jest to przycisk, kt≤ry ma wiΩcej w│a╢ciwo╢ci
ni┐ zwyk│y przycisk Button, m.in. mo┐liwo╢µ
umieszczenia na nim obrazka. Zmieniamy w│a╢ciwo╢ci:
- Height = 41
- Layout = blGlyphTop
- Left = 208
Znaczenie w│a╢ciwo╢ci:
- Layout okre╢la jak obrazek bΩdzie wyr≤wnany
wzglΩdem tekstu na przycisku (blGlyphTop -
obrazek nad tekstem)
Klikamy raz na przycisk, aby go zaznaczyµ,
kopiujemy go do schowka (Ctrl+C) i tworzymy jeszcze
cztery jego kopie (Ctrl+V). Teraz ustawiamy w│a╢ciwo╢ci
pierwszego przycisku:
- Caption = &Open
- Glyph = openhot.bmp
- Name = OpenButton
- Top = 32
Znaczenie w│a╢ciwo╢ci:
- Glyph zawiera ╢cie┐kΩ dostΩpu do
pliku obrazka, kt≤ry bΩdzie wy╢wietlany na
przycisku
Zmieniamy w│a╢ciwo╢ci drugiego przycisku:
- Caption = &Play
- Enabled = false
- Glyph = playbtn.bmp
- Name = PlayButton
- Top = 72
Znaczenie w│a╢ciwo╢ci:
- Enabled okre╢la, czy przycisk jest
aktywny (false - przycisk nieaktywny, u┐ytkownik
nie mo┐e go klikn▒µ)
Zmieniamy w│a╢ciwo╢ci trzeciego przycisku:
- Caption = P&ause
- Enabled = false
- Glyph = pausebtn.bmp
- Name = PauseButton
- Top = 112
Zmieniamy w│a╢ciwo╢ci czwartego przycisku:
- Caption = &Stop
- Enabled = false
- Glyph = stopbtn.bmp
- Name = StopButton
- Top = 152
Zmieniamy w│a╢ciwo╢ci pi▒tego przycisku:
- Caption = &Exit
Enabled = false
Glyph = exithot.bmp
Name = ExitButton
Top = 192
Aby przyciski teraz by│y │adnie u│o┐one
klikamy na pierwszy od g≤ry prawym przyciskiem
myszy, wybieramy Bring To Front i postΩpujemy tak z
ka┐dym od g≤ry do do│u.
Umieszczamy jeszcze jeden Bevel:
- Height = 24
- Left = 0
- Name = ProgressBevel
- Shape = bsFrame
- Top = 240
- Width = 283
Na formularzu umieszczamy CGauge z palety Samples
(taki procentowy wska╝nik postΩpu, chyba ka┐dy go
widzia│). Po zmienieniu w│a╢ciwo╢ci ╢rodkujemy
go wzglΩdem ProgressBevel.
- BackColor = clBlack
- ForeColor = clBlue
- Height = 20
- Name = AnimacjaProgress
- Width = 279
Znaczenie w│a╢ciwo╢ci:
- BackColor okre╢la kolor t│a
komponentu
- ForeColor okre╢la kolor
pierwszoplanowy komponentu
Oczywi╢cie nale┐y te┐ umie╢ciµ komponent
MediaPlayer z zak│adki System, dziΩki kt≤remu bΩdziemy
odtwarzaµ animacje:
- DeviceType = dtAVIVideo
- Display = EkranPanel
- Name = MediaPlayer
- Visible = false
No to mamy ju┐ prawie wszystkie komponenty.
Prawie bo musimy jeszcze dodaµ OpenDialog z zak│adki
Dialogs i Timer z zak│adki System jest to taki
licznik w programie.
Na pocz▒tku zajmijmy siΩ komponentem Timer. S│u┐y
on jako wewnΩtrzny licznik w programie, je╢li go
uruchomimy to "tyka" co jaki╢ okre╢lony
czas i wywo│uje zdarzenie OnTimer. W naszej
aplikacji to zdarzenie przyda siΩ podczas
odgrywania animacji, bΩdzie ono wywo│ywane co 0,1
sekundy i bΩdziemy w nim sprawdzaµ jaki procent
animacji zosta│ odtworzony i zmienimy odpowiednio w│a╢ciwo╢ci
komponentu AnimacjaProgress.
- Enabled = false
- Interval = 100
- Name = Timer
Znaczenie w│a╢ciwo╢ci:
- Enabled okre╢la, czy Timer jest
uruchomiony (false - wy│▒czony)
- Interval okre╢la co jaki czas Timer
"tyka", czas podaje siΩ w
milisekundach (1 sekunda = 1000 milisekund)
W│a╢ciwo╢ci OpenDialog nale┐y ustawiµ jak w
pierwszym tutorialu (pamiΩtaj▒c o ustawieniu Name
= OpenDialog).
Ufff!!! Wreszcie mamy ju┐ utworzone wszystkie
komponenty. Mo┐emy uruchomiµ nasz program (F9) i
obejrzeµ stworzony przez nas interfejs. Ca│kiem
nie╝le, teraz pora wpisaµ parΩ linijek kodu.
Na pocz▒tek tworzymy zdarzenie OnClick dla
OpenButton. klikaj▒c dwukrotnie na przycisk
OpenButton umieszczony na formularzu, zdarzenie to
sprawdza, czy otwarcie okna OpenDialog zako±czy│o
siΩ wci╢niΩciem OK, je╢li tak to do MediaPlayer
wczytywana jest ╢cie┐ka dostΩpu do animacji
wybrana w OpenDialog, MediaPlayer otwiera animacjΩ
(nie odtwarza), obszarem wy╢wietlania animacji bΩdzie
prostok▒t (0, 0, 200, 200) takie rozmiary ma
EkranPanel, nastΩpnie udostΩpniamy przyciski
PlayButton, PauseButton i StopButton, a tak┐e
przyciski na pasku narzΩdzi PlayToolButton,
PauseToolButton i StopToolButton. Ca│e zdarzenie
wygl▒da tak:
void __fastcall
TMainForm::OpenButtonClick(TObject *Sender)
{
if (OpenDialog->Execute())
{
MediaPlayer->FileName
= OpenDialog->FileName;
MediaPlayer->Open();
MediaPlayer->DisplayRect
= Rect(0, 0, 200, 200);
PlayButton->Enabled
= true;
PauseButton->Enabled
= true;
StopButton->Enabled
= true;
PlayToolButton->Enabled
= true;
PauseToolButton->Enabled
= true;
StopToolButton->Enabled
= true;
}
}
Tworzymy zdarzenie OnClick dla PlayButton, kt≤re
rozpoczyna odtwarzanie animacji i uruchamia Timer,
kt≤ry zaczyna "tykaµ".
void __fastcall TMainForm::PlayButtonClick(TObject
*Sender)
{
MediaPlayer->Play();
Timer->Enabled = true;
}
Tworzymy zdarzenie OnClick dla PauseButton, kt≤re
zatrzymuje odtwarzanie animacji:
void __fastcall TMainForm::PauseButtonClick(TObject
*Sender)
{
MediaPlayer->Pause();
}
Tworzymy zdarzenie OnClick dla StopButton, kt≤re
zatrzymuje odtwarzanie animacji i przewija j▒ do
pocz▒tku:
void __fastcall TMainForm::StopButtonClick(TObject
*Sender)
{
MediaPlayer->Stop();
MediaPlayer->Rewind();
}
Tworzymy zdarzenie OnTimer dla Timer klikaj▒c
dwukrotnie na ikonce komponentu Timer, kt≤re
sprawdza w jakim "stanie" jest MediaPlayer.
Je╢li animacja jest odtwarzana to zmienia siΩ
procent wy╢wietlonej animacji na AnimacjaProgress,
a gdy animacja jest zatrzymana to wy│▒czany jest
Timer, procent wy╢wietlonej animacji ustawiany jest
na zero, a animacja jest przewijana do pocz▒tku:
void __fastcall TMainForm::TimerTimer(TObject
*Sender)
{
if (MediaPlayer->Mode
== mpPlaying)
{
AnimacjaProgress->Progress
= MediaPlayer->Position * 100 /
MediaPlayer->Length;
}
if (MediaPlayer->Mode ==
mpStopped)
{
Timer->Enabled
= false;
AnimacjaProgress->Progress
= 0;
MediaPlayer->Rewind();
}
}
Tworzymy zdarzenie OnClick dla ExitButton, kt≤re
zamyka aplikacjΩ:
void __fastcall TMainForm::ExitButtonClick(TObject
*Sender)
{
Close();
}
Teraz zamiast pisaµ jeszcze raz te zdarzenia dla
przycisk≤w z paska narzΩdzi mo┐emy w bardzo
prosty spos≤b przypisaµ im ju┐ istniej▒ce
zdarzenia:
wybieramy ExitToolButton i w Inspektorze Obiekt≤w
klikamy na zak│adkΩ Events (zdarzenia). Jest ich
tam trochΩ ale nas interesuje OnClick, w polu warto╢ci
tego zdarzenia klikamy przycisk ze strza│k▒ w d≤│
i wybieramy ExitButtonClick, podobnie postΩpujemy
dla nastΩpnych przycisk≤w:
- dla OpenToolButton wybieramy OpenButtonClick
- dla PlayToolButton wybieramy PlayButtonClick
- dla PauseToolButton wybieramy PauseButtonClick
- dla StopToolButton wybieramy StopButtonClick
- dla InfoToolButton wybieramy InfoButtonClick
Mogliby╢my r≤wnie dobrze najpierw utworzyµ
zdarzenia dla przycisk≤w z paska narzΩdzi, a p≤╝niej
przypisaµ je przyciskom z formularza.
Wreszcie dobrnΩli╢my do ko±ca drugiego
tutoriala. Mam nadziejΩ, ┐e siΩ wam podoba│.
Zapraszam do trzeciego tutoriala, gdzie dodamy do
programu menu g│≤wne, podpowiedzi w
"chmurkach" i tzw. okienko About.
Je╢li nie mo┐esz siΩ doczekaµ nastΩpnych
tutoriali to zapraszam na moj▒ stronΩ: "Borland
C++ Builder (nie tylko) dla pocz▒tkuj▒cych"
pod adresem www.borland.prv.pl.
Znajdziesz tam wszystko co jest zwi¹zane z
Borland C++ Builderem.
autor: Piotr W≤jtowicz (Hetman)
www: http://www.borland.prv.pl
e-mail: thehetman@poczta.fm
|