Programování PocketPC naruby (3/12)

Patříte mezi uživatele PocketPC, kteří by si rádi také něco naprogramovali, řadíte se však k tzv. falešným začátečníkům? Pak právě vám je určen náš seriál věnovaný programování pro kapesní počítače s Windows Mobile. Dnešní díl věnujeme komunikaci prostřednictvím dialogů.
V minulých dílech našeho seriálu o programování jste se mohli seznámit s úvodem do programování pro Pocket PC zařízení a s návrhem obsahu programu. Dnes se zaměříme na dialogy.

Dialogy

Vlastní komunikace s uživatelem se většinou děje prostřednictvím dialogů. Dialogy u Pocket PC většinou zabírají celý displej; od hlavních oken aplikace se liší tím, že v pravém horním rohu mají tlačítko s textem (ok). Dialogy mohou obsahovat obvyklé ovládací prvky, na které jsme zvyklí z jiných verzí Microsoft Windows.

Pokud váš dialog obsahuje pole pro vstup textu, musíte se zamyslet nad jeho vztahem k SIP (Software Input Panel - virtuální klávesnice nebo ploška pro kreslení znaků v dolní části displeje). Pole pro vstup textu by se měla nacházet v horních dvou třetinách displeje, aby nebyla překryta virtuální klávesnicí. Také se můžete rozhodnout, jak se bude SIP chovat při aktivaci dialogu:

  • automaticky se skryje
  • automaticky se aktivuje
  • aktivuje se v závislosti na vybraném políčku a nastavení operačního systému

Každý dialog musí obsahovat funkci, jež zpracovává zprávy operačního systému, které s dialogem souvisí (inicializaci dialogu - zprávu WM_INITDIALOG a změnu stavu ovládacích prvků - WM_COMMAND). Ani v tomto se neliší Pocket PC od stolních Windows. Příklad nejjednodušší funkce dialogu pod operačním systémem Windows CE 3.0 je v následujícím rámečku; až na volání funkce SHInitDialog, která nastaví SIP panel a tlačítko OK:


BOOL CALLBACK MyDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG:
            {
                SHINITDLGINFO shidi;
                shidi.dwMask = SHIDIM_FLAGS;
                shidi.dwFlags = SHIDIF_DONEBUTTON | 
                                SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN;
                shidi.hDlg = hwnd;
                SHInitDialog(&shidi);
            }
            return TRUE;

        case WM_COMMAND:
            if(wParam == IDOK)
            {
                EndDialog(hwnd, TRUE);
                return TRUE;
            }
            break;

        default:
            break;
    }

    return FALSE;
}

V klasických dialozích na Pocket PC chybí tlačítko pro opuštění dialogu bez provedení změn; ani na softwarové klávesnici se nevyskytuje tlačítko ESC. Vestavěné aplikace (například databáze kontaktů) nedovolují vrátit změny, které uživatel v dialogu udělal zpět. Pro pohodlí uživatele je vhodné do dialogu doplnit vlastní tlačítko pro opuštění dialogu bez uložení změn.

Spuštění aplikace

Chcete-li, aby vaše aplikace mohl uživatel spustit z nabídky programů, musíte umístit jejich zástupce do složky \Windows\Start Menu\Programs\. Pokud uživatel aplikaci spustí, je předána kontrola funkci WinMain (podobně jako u jiných verzí Windows) a je spuštěna nová instance aplikace.

Pokud si nepřejete, aby byla spuštěna více než jedna instance vaší aplikace, je vhodné, aby vaše aplikace po spuštění zkontrolovala, zda již nebyla spuštěna jiná její kopie (voláním funkce FindWindow). Pokud nalezne svoji kopii, předá jí řízení - jinak se sama spustí.


    HWND hWnd = FindWindow(szClassName, szWindowTitle);
	
    if (hWnd)
    {
        SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
        return 0;
    }

Další kód funkce WinMain - vytvoření hlavního okna aplikace a smyčka zpráv - vás jistě nepřekvapí.

Aplikace, které mají svá hlavní okna na obrazovce Today, jsou spuštěné neustále.

Pokud si přejete dát uživateli na vědomí, že je vaše aplikace spuštěna v pozadí, a nabídnout mu jednoduchý způsob, jak do ní přejít, můžete umístit ikonu aplikace do systémové lišty (Tray) voláním funkce Shell_NotifyIcon.

Příště si přiblížíme ukončení aplikace a ukládání dat.