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.
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 ControlNyní 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.
|
- 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:
|
V našem příkladě si prvek IDC_ANIMATE otevřeme při inicializaci, dialogu, tedy v handleru zprávy WM_INITDIALOG:
|
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:
|
- 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:
|
Pokud chceme prvek Animate Control zcela "zavřít", použijeme makro AnimateClose:
|
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 WAVEPokud chceme přehrát jednoduchý (nekomprimovaný) vlnový zvuk WAVE, použijeme funkci PlaySound:
|
- 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ě:
|
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):
- Učíme se Win API - motivační úvod
- Učíme se WinAPI - Začínáme
- Učíme se WinAPI - 3.
- Učíme se Win API - 4.
- Učíme se Win API - 5.
- Učíme se Win API - 6.
- Učíme se Win API - 7.
- Učíme se Win API - 8
- Učíme se Win API - 9.
- Učíme se Win API - 10.
- Učíme se Win API - 11.
- Učíme se Win API - 12.
- Učíme se Win API - 13.
- Učíme se Win API - 14.
- Učíme se Win API - 15.
- Učíme se Win API - 16.
- Učíme se Win API - 17.
- Učime se Win API - 18.
- Učime se Win API - 19.
- Učime se Win API - 20.
- Učime se Win API - 21.
- Učime se Win API - 22.
- Učime se Win API - 23.
- Učime se Win API - 24.
- Učíme se Win API - 25.
- Učíme se Win API - 26.
- Učíme se Win API - 27.
- Učíme se Win API - 28.
- Učíme se Win API - uživatelsky kreslený ListBox
- Učíme se Win API - uživatelsky kreslený ListBox II
- Dialog výběru složky a naplnění ListBoxu soubory
- Vyhledávání souborů - zjištění obsahu složky
- Pracujeme s ComboBoxem ve WinAPI
- Pracujeme s ComboBoxem II.
- Rozšířený prvek ComboBoxEx
- Ovládací prvek TrackBar
- Ovládací prvek Progress Bar
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007