Programování pro PalmOS počítače krok za krokem (54)

Dnes si povíme něco o tom, jak aplikace zpracovává zprávy zasílané operačním systémem PalmOS při výběru z menu. Navrhneme také a vyzkoušíme uživatelskou nabídku pro naši aplikaci.

4.23. Zpracování události menu

Během výběru příkazu z menu potřebuje operační systém PalmOS zpracovávat některé události nezávisle na uživateli. Toto zpracování událostí uživatelské nabídky se děje ve funkci MenuHandleEvent(). Funkce MenuHandleEvent() se postará o zobrazení menu na displeji při stisknutí příslušného tlačítka; je-li menu zobrazeno, tak funkce MenuHandleEvent() vyhodnocuje pohyb perem po displeji a řídí zobrazování jednotlivých karet menu až do té doby, kdy uživatel zvolí příkaz menu nebo zruší jeho zobrazení na displeji.

Pokud uživatel vybere příkaz menu, zařadí funkce MenuHandleEvent() do fronty zpráv příslušnou zprávu menuEvent. Dotkne-li se uživatel displeje mimo hranice menu, operační systém uživatelskou nabídku smaže a obnoví zobrazení formuláře. Podobně se funkce MenuHandleEvent() stará i o zpracování zkrácených příkazů.

Boolean MenuHandleEvent(MenuBarType *menu, EventType *udalost, Uint16 *chyba)

Zpracuje události při zobrazení uživatelské nabídky (menu).

Vstupní parametry
  • menu - ukazatel na strukturu MenuBar, ve které jsou uložena data menu. Pokud má tento parametr hodnotu NULL, je použita standardní uživatelská nabídka, která je u každého formuláře definována za MENUID.
  • udalost - ukazatel na datovou strukturu, ve které jsou uložena data aktuální zprávy.
Výstupní parametry
  • chyba - došlo-li při ovládání uživatelské nabídky k chybě, je kód chyby uložen do této proměnné. Pokud funkce uloží do proměnné chyba jinou hodnotu než O, došlo k chybě.
Vrácená hodnota
  • true - zpráva byla operačním systémem zpracována a další funkce by ji již měly ignorovat.
  • false - Funkce MenuHandleEvent() tuto zprávu nezpracovala.

Funkci MenuHandleEvent() musíme zařadit do smyčky zpracování událostí naší aplikace. Funkci MenuHandleEvent() musíme volat po zpracování události operačním systémem, ale před zpracováním události naší aplikací. Vhodné uspořádání smyčky zpracování událostí v aplikaci, kde používáme menu, je v následujícím rámečku.

static void SmyckaZpracovaniUdalosti()
{
    EventType udalost;
    Err chyba;

    do
    {
        EvtGetEvent(&udalost, evtWaitForever);
		
        if (SysHandleEvent(&udalost)) continue;
		
        if(MenuHandleEvent(NULL, &udalost, &chyba)) continue;
		
        if(UdalostZpracovanaAplikaci(&udalost)) continue;
		
        FrmDispatchEvent(&udalost);
    }
    while(udalost.eType != appStopEvent);
}

Pokud v naší aplikaci používáme v každém formuláři jen standardní menu, můžeme parametry menu a chyba funkce MenuHandleEvent() bezpečně ignorovat.

Doplnění naší aplikace o uživatelskou nabídku

Chceme-li doplnit do naší aplikace uživatelskou nabídku, musíme ji nejprve definovat v souboru prostředků aplikace. Máme dva formuláře a menu definujeme pro každý formulář zvlášť.

Před tím, než začneme definovat jednotlivé karty menu, musíme si rozmyslet, jaké příkazy budou v menu uvedeny. Struktura menu ve formulářích by měla dodržovat několik jednoduchých doporučení:

  1. Příkazy na jednotlivých kartách menu by měly být seskupeny podle logické souvislosti.
  2. Pokud je nějaká funkce dostupná pomocí tlačítka ve formuláři, je zbytečné uvádět ji v menu.
  3. Je-li ve formuláři uvedeno políčko pro editaci textu, musí být v uživatelské nabídce uvedena karta Editace, která má standardní obsah a kterou budu popisovat v příštím dílu.
  4. U programů, které jsou distribuovány jako shareware nebo freeware, by měl být součástí uživatelské nabídky příkaz nazvaný O programu, který bude uživatele informovat o podmínkách šíření programu.

Pro vyzkoušení uživatelské nabídky definujeme jedno menu s právě jednou položkou: informací o programu. Po zvolení této položky zobrazíme informaci o programu tím nejjednodušším způsobem: funkcí FrmHelp(), kterou již známe ze třetí kapitoly. Toto menu bude přiřazeno k oběma formulářům aplikace.

V souboru prostředků aplikace musíme definovat příslušné menu a text nápovědy. Do definic obou formulářů musíme zařadit klíčové slovo MENUID, kterým k formuláři přiřazujeme standardní menu.

FORM ID FormularVstupni AT (0 0 160 160)
MENUID MenuSpolecne
BEGIN
    TITLE "Sifrovaci program"
    ...
END

FORM ID FormularVystupni AT (0 0 160 160)
MENUID MenuSpolecne
BEGIN
    TITLE "Zakodovany text"
    ...
END

MENU ID MenuSpolecne
BEGIN
  PULLDOWN "Program"
  BEGIN
    MENUITEM "O Programu" ID PolozkaMenuOProgramu "O"
  END
END

STRING ID TextOProgramu " Tento program je soucasti knihy "     ">>Programovani pro Palm Piloty krok za krokem<<.\n\n"     " Program je distribuovan jako freeware a autor nenese "     "zadnou odpovednost za skody vznikle pouzitim programu."

Nesmíme také zapomenout doplnit odpovídající definice konstant do hlavičkového souboru.


V příštím dílu doplníme zdrojový text programu o zpracování události menu a rozebereme si funkce menu na kartě Editace.