Radek Chalupao programování a počítačích, vývoj software, školení ...
Domů | Články | Ukázky kódu | Tipy a triky | Aktuality | Školení a konzultace | Vývoj software | Freeware | Kontakt

Zvuky a animace.  25.1.2002

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 v prostředcích (resources) programu.

win-api-25

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
);

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
);

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    
);

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));
}

Doprovodný projekt je ke stažení zde: win_api_25.zip


Máte připomínku, dotaz nebo komentář k článku a souvisejícími tématy?

Napište a odešlete ji emailem

Copyright © 2019  Radek Chalupa