Učíme se Win API - 25. - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

Učíme se Win API - 25.

winapi_logo

29. července 2002, 00.00 | V tomto pokračování se naučíme, jak můžeme oživit program zvuky (typu wave) a
animacemi (avi). V obou případech budeme mít data zvuku a animace uložena ve
zdrojích (resources) programu.

Zvuky a animace

V tomto pokračování se naučíme, jak můžeme oživit program zvuky (typu wave) a animacemi (avi). V obou případech budeme mít data zvuku a animace uložena ve zdrojích (resources) programu.

Vytvořme si tedy aplikaci založenou na dialogu. Přidejme si zdroj dialogu a dále si importujme dva zdroje ze souboru. Prvním bude soubor .wav, obsahující vlnový zvuk wave. Tento zvuk by neměl být nijak komprimovaný. Pokud se resource editor při importu zeptá na typ zdroje, zadáme "WAVE". Druhým zdrojem bude soubor .avi, obsahující animaci, která nesmí obsahovat zvuk. Já jsem použil jednu ze systémových animací, vytaženou a uloženou do souboru ze systémové knihovny Windows (shell32.dll). U tohoto zdroje jako typ zadáme "AVI". Na dialog si umístíme prvek "Animation Control". V jeho vlastnostech si můžeme přímo v resource editoru nastavit vlastnost "Animation transparent" (odpovídá stylu okna ACS_TRANSPARENT) na TRUE - pozadí animace pak zůstane nedotčeno a bude tedy tvořeno pozadím dialogu. Pokud nechceme mít kolem animace vnořený okraj, nastavíme také vlastnost "Border" na FALSE.

Použití prvku Animate Control

Nyní trocha teorie. Prvek Animation Control patří mezi běžné prvky Windows (Windows Common Controls). Pokud bychom ho vytvářeli programově, museli bychom nejdříve použít makro Animate_Create, které "uvnitř" volá funkci CreateWindow, čímž vytvoří okno příslušné třídy.

HWND Animate_Create(
    HWND hwndP, 
    UINT id, 
    DWORD dwStyle, 
    HINSTANCE hInstance
);
  • hwndP - okno vlastníka prvku Animate Control
  • id - identifikátor prvku animate
  • dwStyle - styly prvku Aninmate (popis neleznete v dokumentaci)
  • hInstance - handle instance

Pokud (jako v našem případě) máme tento prvek na dialogu, máme při inicializaci dialogu již prvek vytvořen, použijeme pro "otevření" animačního prvku makro Animate_Open:

BOOL Animate_Open(
  HWND hwndAnim, // handle okna prvku Animate Control
  LPTSTR lpszName // jméno zdroje 
);

V našem příkladě si prvek IDC_ANIMATE otevřeme při inicializaci, dialogu, tedy v handleru zprávy WM_INITDIALOG:

void OnInitDialog(HWND hwndDlg)
{
  Animate_Open(GetDlgItem(hwndDlg, IDC_ANIMATE), MAKEINTRESOURCE(IDR_SEARCH));
}

Identifikátor IDR_SEARCH představuje importovaný zdroj typu AVI, konkrétně jde o systémovou animaci nazývanou "baterka". Pokud bychom chtěli, aby se animace rozběhla již při vytvoření, mohli bychom nastavit vlastnost "Auto Play" (odpovídající stylu okna ACS_AUTOPLAY) na TRUE. My však budeme animaci spouštět a zastavovat na stisknutí dvou tlačítek na dialogu. Ke spuštění použijeme makro Animate_Play:

BOOL Animate_Play(
    HWND hwndAnim, 
    UINT wFrom, 
    UINT wTo, 
    UINT cRepeat
);
  • hwndAnim - handle prvku Animate Control
  • wFrom - index (číslovaný od nuly) obrázku v animaci, od kterého se má spustit přehrávání
  • wTo - index obrázku, u kterého se má přehrání animace ukončit. Pokud uvedeme hodnotu -1, animace se přehraje k poslednímu obrázku.
  • cRepeat - počet opakování, hodnota -1 znamená neustálé opakování až do ukončení jiným příkazem.

Pro zastavení animace pak slouží makro Animate_Stop:

BOOL Animate_Stop(
    HWND hwndAnim // handle prvku animate control
);

Pokud chceme prvek Animate Control zcela "zavřít", použijeme makro AnimateClose:

BOOL Animate_Close(
    HWND hwnd
);

Toto makro samozřejmě nejprve zastaví animaci, pokud je v tom okamžiku spuštěna, a je zobrazen první obrázek AVI klipu. Pokud bychom chtěli AVI klip zcela vizuálně odstranit, mohli bychom použít již známou funkci ShowWindow s parametrem SW_HIDE, nebo zrušit okno prvku funkcí DestroyWindow.

K použití prvku Animate Control ještě doplním, že je nutné před jeho vytvořením, v našem případě tedy před vyvoláním dialogu funkcí DialogBox, inicializovat tzv. běžné prvky Windows (z tohoto seriálu již známou) funkcí InitCommonControls, nebo InitCommonControlsEx.

Přehrávání vlnového zvuku WAVE

Pokud chceme přehrát jednoduchý (nekomprimovaný) vlnový zvuk WAVE, použijeme funkci PlaySound:

BOOL PlaySound(
  LPCSTR pszSound, 
  HMODULE hmod,     
  DWORD fdwSound    
);
  • pszSound - název zvuku. Může to být název zdroje (resource) nebo název externího souboru wav.
  • hmod - handle modulu obsahujícího zdroj. Pokud nejde o zvuk ve zdrojích, musí mít hodnotu NULL.
  • fdwSound - volby přehrávání. Jejich plný výčet s popisem naleznete v dokumentaci. Zmíním se jen o některých:
    • SND_FILENAME - zvuk je přehráván ze souboru
    • SND_RESOURCE - zvuk je ve zdrojích programu.
    • SND_SYNC - funkce je ukončena až po přehrání zvuku do konce
    • SND_ASYNC - funkce je ukončena a program pokračuje hned po spuštění přehrávání a toto přehrávání pokračuje asynchronně za běhu programu, pokud není předčasně ukončeno dalším voláním této funkce nebo samozřejmě například ukončením celého programu.

Vraťme se k našemu ukázkovému příkladu. Na dialogu máme 2 tlačítka, na které budeme spouštět a zastavovat animaci, a při spuštění animace přehrajeme asynchronně zvuk ze zdrojů (s identifikátorem IDR_OK). Handlery stisknutí tlačítek budou tedy vypadat následovně:

void OnPlayAVI(HWND hwndDlg)
{
  PlaySound(MAKEINTRESOURCE(IDR_OK), g_hInst, SND_RESOURCE | SND_ASYNC);
  Animate_Play(GetDlgItem(hwndDlg, IDC_ANIMATE),0,-1,-1);
}

void OnStopAVI(HWND hwndDlg)
{
  Animate_Stop(GetDlgItem(hwndDlg, IDC_ANIMATE));
}

Zde si můžete stáhnout ukázkový projekt (Visual C++ .NET): win_api_25.zip (59 kB).

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: