Programování pro PocketPC - Aplikace založené na dialogu 3/6

Aplikace založené na dialogu jsou tím naprosto nejjednodušším druhem aplikací pro počítače s operačním systémem založeným na Microsoft Windows, včetně zařízení PocketPC. Ukážeme vám, jak je naprogramovat a k čemu všemu mohou sloužit.

Aplikace založené na dialogu jsou tím naprosto nejjednodušším druhem aplikací pro počítače s operačním systémem založeným na Microsoft Windows, včetně zařízení PocketPC. V této minisérii budeme mluvit o aplikacích založených na různých typech dialogů a ukážeme si, že je velmi jednoduché je naprogramovat a jdou používat nejen k vytváření jednoduchých aplikací, ale například i k "simulaci" uživatelského rozhraní PalmOS.

Pro začátečníka je často první úspěšně přeložená a fungující aplikace založená na dialogu vstupenkou do světa programování v operačním systému Windows CE.

"Nový" vzhled PocketPC dialogů

S příchodem počítačů typu PocketPC přestal klasický vzhled dialogů stačit. Dialogy nového stylu nemají titulkový pruh a jsou vždy roztaženy přes celý displej. Standardním prostředkem ukončení dialogu se stalo tlačítko (OK) v pravém horním rohu dialogu. Tlačítko (OK) má standardně identifikátor IDOK.

Jedinou významnou slabinou ovládání nových dialogů je chybějící standardizovaný způsob, jak dialog ukončit bez uložení informací. Pokud si přejeme dát uživateli možnost ukončit dialog bez uložení informací, musíme buď sami doplnit do dialogu tlačítko Zruš/Cancel, nebo toto tlačítko umístit do řádku MenuBar.

I nový vzhled dialogu nastavujeme při inicializaci dialogu při obsluze zprávy WM_INITDIALOG. Vuláme funkci SHInitDialog, které předáme vyplněnou strukturu SHINITDLGINFO:

SHINITDLGINFO shidi;
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIZEDLGFULLSCREEN;
shidi.hDlg = hDlg;
SHInitDialog(&shidi);

Pomocí příznaku SHIDIM_FLAGS zvolíme, že si přejeme nastavit typ dialogu, příznak SHIDIF_SIZEDLGFULLSCREEN zvolí právě námi požadovaný "nový" vzhled dialogu. Význam příznaku SHIDIF_DONEBUTTON je následující:

SHIDIF_DONEBUTTON | SHIDIF_SIZEDLGFULLSCREEN V pravém horním rohu je tlačítko (OK), které po stisknutí generuje zprávu WM_COMMAND s identifikátorem IDOK.
pouze SHIDIF_SIZEDLGFULLSCREEN V pravém horním rohu je zobrazeno tlačítko s křížkem; stidknutí tohoto tlačítka přenese aplikaci do pozadí.

Každé kliknutí na ikonu naší aplikace je vytvořeno nové okno dialogu. Toto chování není zdaleka optimální - pokud například uživatel začne psát text, přepne se do jiné aplikace a znovu klikne na ikonu v seznamu aplikací, spustí se nová instance aplikace i dialogové okno. Současně může narůstat počet spuštěných kopií naší jediné aplikace.

Proto je výhodné testovat po spuštění naší aplikace, zda není již náš dialog zobrazen. Nejjednodušším způsobem je použití funkce FindWindow, která vyhledá okno v závislosti na jeho třídě a titulku. Dialogy mají vždy třídu oken DIALOG, hledaný titulek okna je totožný s titulkem dialogu:

HWND hwnd = FindWindow(TEXT("DIALOG"), TEXT("Pokus 3"));

if(hwnd)
{
    SetForegroundWindow(hwnd);
    return 0;
}

Pokud naši aplikaci nyní spustíme opakovaně, pokusí se nejprve vyhledat svoji dříve spuštěnou kopii a pokud existuje, tak ji zobrazí pomocí funkce SetForegroundWindow a ukončí se. Výsledkem bude uživatelův pocit, že pracuje s jednou aplikací, do které se může přepínat pomocí ikony v seznamu aplikací.

Pokud potřebujeme změnit nebo upravit titulek okna, voláme funkci SetWindowText, která funguje i na titulky dialogů.

Zdrojový text příkladu si můžete stáhnout (ZIP) zde.

Vytváření uživatelského rozhraní v eVC++

Při práci s "novými" dialogy v eVC++ se setkáte s tím, že budete muset odhadnout velikost vytvářeného dialogu. Bylo by sice logické, aby eVC++ obsahoval nějaký vzor pro dialogy přes celý displej, ale není tomu tak. Lepší, než určovat velikost dialogu metodou pokus-omyl je následující výpočet:

Velikost dialogu se udává tradičně v "dialogových jednotkách". Jedna takováto jednotka šířky je definována jako 1/4 průměrné šířky použitého písma a dialogová jednotka výšky je definována jako 1/8 průměrné výšky použitého písma. Pro počítače PocketPC, kde je standardní písmo MS Sans 8, které je vysoké asi 14 pixelů a široké asi 7 pixelů nám vychází maximální velikost dialogu přibližně na 137 x 154 dialogových jednotek:

šířka 240 pixelů / 7 * 4 = 137 d.u.
(výška 320 pixelů - titulek okna - command bar = 270 pixelů) / 14 * 8 = 154 d.u. 

Pokud vytvoříme dialog menší, než je displej, bude automaticky rozšířen. Překročíme-li však rozměry displeje, mohou se některé ovládací prvky dostat za hranice displeje a uživatel s nimi nebude moci pracovat.


V příštím díle budeme mluvit o aplikacích, které jsou založeny na uživatelském rozhraní programovatelném v HTML.