23. R∙znΘ aplikace III
  1. V dalÜφ aplikaci se seznßmφme s pou₧φvßnφm funkce MessageBeep. ZaΦneme s v²vojem novΘ aplikace a na formulß° umφstφme skupinu p∞ti voliΦ∙ s texty mb_IconAsterisk, mb_IconExclamation, mb_IconHand, mb_IconQuestion a mb_Ok (jsou to jmΘna standardnφch zvuk∙ Windows) a t°i tlaΦφtka s texty Test, Beep 0xFFFF a Beep Sound. Pokud chceme zjistit, zda v naÜem poΦφtaΦi je instalovßn ovladaΦ zvuku (mßme zvukovou kartu), pak stiskneme tlaΦφtko Test. Toto zjiÜt∞nφ je provedeno funkcφ waveOutGetNumDevs (funkce je v hlaviΦkovΘm souboru Mmsystem.h). Obsluha stisku tohoto tlaΦφtka je tvo°ena t∞mito p°φkazy:

  2. if (waveOutGetNumDevs() > 0)
      MessageDlg("Zvuky jsou podporovßny", mtInformation,
                 TMsgDlgButtons() << mbOK, 0);
    else
      MessageDlg("Zvuky nejsou podporovßny", mtInformation,
                 TMsgDlgButtons() << mbOK, 0);
    TlaΦφtko Beep 0xFFFF vydßvß standardnφ zvuk. Jeho obsluhu tvo°φ p°φkaz:
    MessageBeep(0xFFFF);
    TlaΦφtko Beep Sound p°ehraje zvuk podle vybranΘho voliΦe. Jeho obsluha je tvo°ena p°φkazy:
    unsigned short Priznak;
    switch (RadioGroup1->ItemIndex) {
      case 0: Priznak = MB_ICONASTERISK; break;
      case 1: Priznak = MB_ICONEXCLAMATION; break;
      case 2: Priznak = MB_ICONHAND; break;
      case 3: Priznak = MB_ICONQUESTION; break;
      case 4: Priznak = MB_OK; break;
    }
    MessageBeep(Priznak);
    Tφm jsme dokonΦili v²voj tΘto aplikace. Pokud mßte v poΦφtaΦi zvukovou kartu, pak ji m∙₧ete vyzkouÜet.
  3. Vytvo°φme jeÜt∞ obdobnou aplikaci, ve kterΘ si nadefinujeme strukturu pro ulo₧enφ informacφ o jednotliv²ch zvucφch. ZaΦneme v²voj novΘ aplikace a na formulß° vlo₧φme komponentu ListBox, tlaΦφtko a dv∞ komponenty Label (jednu k hornφmu okraji formulß°e a druhou ke spodnφmu okraji). V hornφ komponent∞ Label zm∞nφme text na: Vyber libovoln² zvuk ze seznamu a pro jeho p°ehrßnφ stiskni tlaΦφtko. U spodnφ komponenty Label text zruÜφme. P°ed deklaraci t°φdy formulß°e v hlaviΦkovΘm souboru vlo₧φme deklaraci struktury:

  4. struct soundinfo
    {
        char *name;
        UINT value;
        char *param;
    };
    a na zaΦßtek zdrojovΘho souboru formulß°e nßsledujφcφ deklaraci:
    soundinfo sounds[] = {
                {"Standard", 0xFFFFFF, "0xFFFFFF"},
                {"Asterisk", MB_ICONASTERISK, "MB_ICONASTERISK"},
                {"Exclamation", MB_ICONEXCLAMATION, "MB_ICONEXCLAMATION"},
                {"Hand", MB_ICONHAND, "MB_ICONHAND"},
                {"Question", MB_ICONQUESTION, "MB_ICONQUESTION"},
                {"Default", MB_OK, "MB_OK"}
         };
    Obsluha udßlosti OnCreate formulß°e je tvo°ena p°φkazy:
    for (int x=0; x<6; x++)
      ListBox1->Items->Add(sounds[x].name);
    a obsluha stisku tlaΦφtka t∞mito p°φkazy:
    for (int x=0; x<6; x++)
      if (ListBox1->Selected[x]) {
        MessageBeep(sounds[x].value);
        Label2->Caption = "MessageBeep("+AnsiString(sounds[x].param)+");";
    }
  5. Funkce sndPlaySound (je definovanß v Mmsystem.h) m∙₧e b²t pou₧ita k p°ehrßvßnφ systΘmov²ch zvuk∙ a soubor∙ WAV. Na formulß° umφstφme komponentu ListBox, ve kterΘ uvedeme n∞kterΘ systΘmovΘ zvuky a soubory WAV (nap°. SystemStart, SystemExit, SystemQuestion, Bell.wav a Dog.wav) a tlaΦφtka Hraj, Zastav a Cyklus. V obsluze OnCreate formulß°e vynulujeme vlastnost ItemIndex komponenty ListBox. Obsluha stisku tlaΦφtka Hraj je tvo°ena p°φkazy:

  6. sndPlaySound(
      ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), SND_ASYNC);
    Tento k≤d m∙₧e b²t pou₧it k p°ehrßvßnφ jak systΘmov²ch zvuk∙, tak soubor∙ WAV. Pokud polo₧ka seznamu nemß ₧ßdn² odpovφdajφcφ soubor nebo systΘmov² zvuk, pak se zahraje implicitnφ zvuk. Druh² parametr udßvß, ₧e mß funkce p°ehrßt zvuk asynchronn∞ a ihned vrßtit °φzenφ systΘmu. Pokud zde pou₧ijeme SND_SYNC, pak funkce nevrßtφ °φzenφ, pokud nenφ cel² zvuk kompletn∞ p°ehrßn. V naÜem p°φpad∞ (p°i asynchronnφm p°ehrßvßnφ) m∙₧eme ale zvuk zastavit op∞tovn²m volßnφm stejnΘ funkce, bez prvnφho parametru (obsluha stisku tlaΦφtka Zastav):
    sndPlaySound(NULL, 0);
    Poslednφ tlaΦφtko provßdφ opakovanΘ p°ehrßvßnφ zvuku. Jeho obsluha je tvo°ena p°φkazy:
    sndPlaySound(ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(),
      SND_ASYNC | SND_LOOP);
    Aplikace je hotova a pokud vlastnφme zvukovou kartu, pak si m∙₧eme vyzkouÜet p°ehrßvßnφ r∙zn²ch soubor∙ WAV.
  7. Komponenta MediaPlayer obsahuje v∞tÜinu schopnostφ Media Control Interface (MCI) Windows, vysoko·rov≥ovΘho rozhranφ pro °φzenφ vnit°nφch a vn∞jÜφch multimedißlnφch za°φzenφ. P°edevÜφm si povÜimn∞me vlastnosti DeviceType. M∙₧e nab²vat hodnoty dtAutoSelect, kterß znaΦφ, ₧e druh za°φzenφ zßvisφ na p°φpon∞ aktußlnφho souboru. Alternativn∞ m∙₧eme zadat nap°. dtAVIVideo, dtCDAudio, dtWaveAudio nebo mnoho jin²ch. Je to jedin² p°φstup, kter² m∙₧eme pou₧φt pro za°φzenφ net²kajφcφ se souboru, jako Φtecφ za°φzenφ zvukovΘho CD. Jestli₧e je druh za°φzenφ i soubor vybrßn, m∙₧eme danΘ za°φzenφ otev°φt (nebo nastavit hodnotu vlastnosti AutoOpen na true) a tlaΦφtka komponenty MediaPlayer budou p°φstupnß (ne vÜechny jsou smysluplnß pro ka₧d² druh mΘdia). Komponenta mß t°i vlastnosti t²kajφcφ se tlaΦφtek: VisibleButtons, EnabledButtons a ColoredButtons. Prvnφ urΦuje, kterß tlaΦφtka jsou p°φtomnß v ovladaΦi, druhß povolenß tlaΦφtka a t°etφ tlaΦφtka s barevn²m oznaΦenφm. Komponenta mß takΘ udßlost OnClick. Tato udßlost je ale jinß ne₧ obvykle, proto₧e obsahuje parametr udßvajφcφ, kterΘ tlaΦφtko bylo stisknuto a dalÜφ parametr m∙₧eme pou₧φt k potlaΦenφ implicitnφ akce spojenΘ s tlaΦφtkem. Udßlost OnNotify informuje komponentu o ·sp∞Ünosti akce generovanΘ tlaΦφtkem. Jinß udßlost OnPostClick je generovßna bu∩ jakmile akce zaΦne nebo kdy₧ skonΦφ (v zßvislosti na hodnot∞ vlastnosti Wait; urΦuje zda operace majφ Φi nemajφ b²t synchronnφ).

  8. ZaΦneme s v²vojem novΘ aplikace. K hornφmu okraji formulß°e vlo₧φme komponentu Label s textem Soubor: a vedle dalÜφ komponentu Label jejφ₧ text zruÜφme a nazveme ji FileLabel. Pod tyto komponenty vlo₧φme tlaΦφtko s textem Nov² soubor .... Obsluhu stisku tohoto tlaΦφtka tvo°φ p°φkazy (na formulß° musφme vlo₧it i OpenDialog, kde nastavφme vlastnost Filter na Soubory wav (*.wav) a Soubory midi (*.mid)):
    if (OpenDialog1->Execute()) {
      FileLabel->Caption = OpenDialog1->FileName;
      MediaPlayer1->FileName = OpenDialog1->FileName;
      MediaPlayer1->Open();
      MediaPlayer1->Notify = True;
    }
    Pod tlaΦφtkem umφstφme nad sebe dv∞ komponenty Label s texty Zprßva: a Akce: a vedle n∞ dalÜφ dv∞ komponenty Label jejich text op∞t zruÜφme a nazveme je NotifLabel a ActionLabel. Pod tyto komponenty vlo₧φme komponentu MediaPlayer, kde nechßme zobrazit pouze prvnφch p∞t tlaΦφtek. Pro tuto komponentu vytvo°φme obsluhy udßlostφ OnClick a OnNotify. Prvnφ obsluhu tvo°φ p°φkazy:
    switch (Button) {
      case btPlay: ActionLabel->Caption = "Playing"; break;
      case btPause: ActionLabel->Caption = "Paused"; break;
      case btStop: ActionLabel->Caption = "Stopped"; break;
      case btNext: ActionLabel->Caption = "Next"; break;
      case btPrev: ActionLabel->Caption = "Previous"; break;
    }
    a druhou p°φkazy:
    switch (MediaPlayer1->NotifyValue){
      case nvSuccessful: NotifLabel->Caption = "Success"; break;
      case nvSuperseded: NotifLabel->Caption = "Superseded"; break;
      case nvAborted: NotifLabel->Caption = "Aborted"; break;
      case nvFailure: NotifLabel->Caption = "Failure"; break;
    }
    MediaPlayer1->Notify = true;
    Aplikace je hotova a pokud vlastnφme zvukovou kartu, pak si m∙₧eme p°ehrßt n∞jak² zvukov² soubor.
  9. V dalÜφ aplikaci se budeme zab²vat videem. Tuto aplikaci m∙₧eme spustit pouze, mßme-li na naÜem poΦφtaΦi n∞kter² z ovladaΦ∙ pro video (nap°. Microsoft Video for Windows). ZaΦneme s v²vojem novΘ aplikace, na formulß° umφstφme komponentu MediaPlayer, do jejφ vlastnosti FileName zadßme n∞kter² soubor AVI a vlastnost AutoOpen nastavφme na true. Nynφ ji₧ aplikaci m∙₧eme spustit a stiskem tlaΦφtka Play spustφme p°ehrßvßnφ zadanΘho videa.
  10. Jestli₧e nechceme video spouÜt∞t ve zvlßÜtnφm okn∞, pak na formulß° m∙₧eme vlo₧it nap°. komponentu Panel a vlastnosti Display komponenty MediaPlayer urΦφme, kde se video bude zobrazovat. Zde mohou ale vzniknout problΘmy s rozm∞ry zobrazovacφ plochy. VyzkouÜejte.
  11. Pokuste se vytvo°it aplikaci pro p°ehrßvßnφ zvukov²ch CD.
  12. Podφvßme se op∞t na jednu hotovou aplikaci. Aplikaci si stßhn∞te. Tato aplikace obsahuje jednoduch² p∞tistrßnkov² editor, ze kterΘho je mo₧no tisknout. Podφvejte se, jak je vy°eÜeno to, ₧e p°i stisku tlaΦφtka m∙₧eme tisknout vÜechny strßnky nebo pouze n∞jak² interval strßnek. Podφvejte se i na zjiÜ¥ovßnφ dalÜφch voleb nastaven²ch u₧ivatelem v dialogovΘm okn∞ tisku. DalÜφ zajφmavß schopnost programu je pou₧itφ TStringList pro sprßvu text∙ na zßlo₧kßch strßnek. Aplikaci vyzkouÜejte.
23. R∙znΘ aplikace III