Programování pro PocketPC - Aplikace založené na dialogu 4/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.

Dialogy programovatelné v HTML

Věřte nebo ne, ale na počítačích s operačním systémem PocketPC je velmi jednoduché naprogramovat aplikaci, která s uživateli komunikuje prostřednictvím uživatelského rozhraní, popsaného v jazyce HTML. Je to možné díky komponentě HtmlViewer, která nemá svoji paralelu na stolních Windows.

Do námi vytvořeného dialogu je možné komponentu přidat vložením uživatelem definovaného ovládacího prvku (Custom control), který do dialogu vložíme pomocí ikony vpravo. Ve vlastnostech prvku pak nastavíme jméno třídy na DISPLAYCLASS:

Posledními dvěma podmínkami pro úspěšné používání dialogů založených na HTML je přidání knihovny htmlview.lib na záložce Link nastavení projektu a inicializace, kterou provedeme ve funkci WinMain:

InitHTMLControl(hInstance);

S prohlížečem HTML komunikujete pomocí zpráv, které mu zasíláte; nejdůležitější zprávy jsou následující:

DTM_CLEAR Vymaže obsah prohlížeče HTML.
DTM_ADDTEXTW Přidává text do prohlížeče; pokud má wParam hodnotu FALSE, přidává se text jako HTML, jestliže má hodnotu TRUE, tak nejsou interpretovány HTML formátovací značky.
DTM_ENDOFSOURCE Označuje konec dokumentu a umožňuje jej vykreslit.
DTM_SETIMAGE Používá se při asociaci bitmapy s parametrem src prvku img.
DTM_NAVIGATE Přejde na libovolné zvolené URL.

Takže jednoduchý HTML formulář vytvoříme například voláním následujících funkcí při zpracování události WM_INITDIALOG (uznávám, že jeho design je spíše ... strohý):

hwndHTML = GetDlgItem(hDlg, IDC_FRAME);
SendMessage(hwndHTML, DTM_CLEAR, 0, 0L);
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("<HTML><BODY><P>Toto je text, <b>tucne</b> a <i>kurziva</i></P>"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("<CENTER><A HREF=MujHyperlink>Hyperlink</A><BR>"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("<FORM method=post action=MujFormular>"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("<INPUT TYPE=checkbox NAME=skrt /> Zaskrtni<BR>"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("Napis: <INPUT TYPE=text SIZE=10 NAME=edituj /><BR>"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("<INPUT TYPE=submit VALUE=Stiskni />"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("</FORM></CENTER>"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("<INPUT TYPE=button VALUE=Konec NAME=Konec /><BR>"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("</CENTER>"));
SendMessage(hwndHTML, DTM_ADDTEXTW, FALSE, (LPARAM)TEXT("</BODY></HTML>"));
SendMessage(hwndHTML, DTM_ENDOFSOURCE, 0, (LPARAM)NULL);

Ovládací prvek zobrazující HTML, který jsme vložili do formuláře, zasílá funkci dialogu zprávy WM_NOTIFY. Tyto zprávy informují funkci dialogu o kliknutí na odkaz, nutnosti načíst obrázek a podobně. Jednoduchý příklad zpracování zprávy WM_NOTIFY je následující:

case WM_NOTIFY:
    if(LOWORD(wParam) == IDC_FRAME)
    {
        NM_HTMLVIEW *pn = (NM_HTMLVIEW *)lParam;

        if(pn->hdr.code == NM_HOTSPOT && pn->szTarget)
        {
            if(_tcscmp(pn->szTarget, TEXT("MujFormular")) == 0)
            {
                MessageBox(hDlg, pn->szData, TEXT("Formular"), MB_OK);
                return TRUE;
            }
            else if(_tcscmp(pn->szTarget, TEXT("Konec")) == 0)
            {
                PostQuitMessage(0);
                return TRUE;
            }
// ...
            return FALSE;
    }            
    break;

Tučně zvýrazněný text v obou příkladech zdrojového kódu jsou jména hyperlinků, které definujeme v našem HTML kódu a na něž můžeme reagovat při zpracování notifikace NM_HOTSPOT.

Současně není jednodušší věc, než "přepínání formulářů". Prostou změnou obsahu prvku pro prohlížení HTML (sekvence zpráv DTM_CLEAR, DTM_ADDTEXTW a DTM_ENDOFSOURCE) zaměníte prohlížený dokument za jiný.

Prvek pro prohlížení HTML v sobě obsahuje celou funkcionalitu Pocket Internet Exploreru, která je sice hluboko pod úrovní stolních prohlížečů, ale přesto umožňuje vytvořit elegantní uživatelské rozhraní.

Jako vždy, příklad naleznete ke stažení (ZIP) zde.


V dalším dílu si do aplikace založené na dialogu přidáme prázdné hlavní okno programu a naznačíme si, jak simulovat přepínání dialogů v uživatelském rozhraní počítačů s PalmOS.