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 |
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.