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