Klávesové zkratky na tomto webu - základní
Přeskočit hlavičku portálu


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

aktualizováno 
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.

Přepínání mezi dialogy ve stylu Palm Pilotů

Uživatelské rozhraní počítačů Palm Pilot nemá z úsporných důvodů koncepci "hlavního okna aplikace". Místo toho je složeno z řady formulářů, z nichž vždy je alespoň jeden zobrazen na displeji.

Pokud bychom chtěli teoreticky vytvářet aplikaci se společným uživatelským rozhraním na počítači s PalmOS i na PocketPC, pak je přirozené použít právě aplikaci založenou na dialogu. Každý formulář PalmOS budeme simulovat jedním dialogem PocketPC.

V naší aplikaci musíme vyřešit, jak mezi sebou jednoduchým způsobem přepínat dialogy na displeji. Nabízím vám jedno z možných řešení, na kterém si ukážeme několik dalších vlastností dialogových oken.

Bude se nám hodit i (doteď nepoužité) hlavní okno aplikace, které bude v pozadí a které bude zajišťovat zprávy společné pro naši aplikaci. Současně zabrání nepříjemnému blikání při přepínání mezi dialogy. Připomenu úplně standardní funkci WinMain:

#define WM_PREPNIDIALOG (WM_USER + 16) // Konstantni jmeno okna a trida okna TCHAR* g_mainWinName = TEXT("Aplikace s dialogy"); TCHAR* g_mainWinClass = TEXT("dialogyV1"); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { g_hInst = hInstance; HWND other = FindWindow(g_mainWinClass, g_mainWinName); if(other) { SetForegroundWindow(other); return 0; } WNDCLASS wc = { CS_VREDRAW|CS_HREDRAW, MainWindowProc, 0, 0, g_hInst, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, g_mainWinClass }; RegisterClass(&wc); HWND hwndMain = CreateWindowEx( 0, g_mainWinClass, g_mainWinName, WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwndMain, SW_MAXIMIZE); // Zobrazime prvni vybrany dialog PostMessage(hwndMain, WM_PREPNIDIALOG, (WPARAM)IDD_TABLE, (LPARAM)TableDlgProc); MSG msg; // Smycka zpracovani udalosti while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }


Základem je implementace zpracování zprávy WM_PREPNIDIALOG, při kterém obsahuje wParam resource identifikator dialogu a lParam adresu funkce dialogu. Zpracovaní této události je vyřešeno nasledujícím způsobem:

case WM_PREPNIDIALOG: { int newid = DialogBox(g_hInst, (LPCTSTR)wParam, hwnd, (DLGPROC)lParam); switch(newid) { case IDD_TABLE: PostMessage(hwnd, WM_PREPNIDIALOG, (WPARAM)IDD_TABLE, (LPARAM)TableDlgProc); break; case IDD_OPTIONS: PostMessage(hwnd, WM_PREPNIDIALOG, (WPARAM)IDD_OPTIONS, (LPARAM)OptionsDlgProc); break; ... default: PostQuitMessage(0); break; } } return 0L;


Jak vidíme, tak na začátku zavoláme dialog, jehož resource identifikátor a adresa funkce byly ve zprávě předány. Poté vezmeme hodnotu, vrácenou funkcí DialogBox (je to druhý parametr funkce EndDialog) a podle této hodnoty zařadíme do fronty zpráv další zprávu WM_PREPNIDIALOG (nebo ukončíme aplikaci).

Pokud si ve funkci dialogu přejeme přepnout se do jiného dialogu, zavoláme funkci EndDialog s vhodným parametrem, například:

EndDialog(hDlg, IDD_OPTIONS);


Příklad si můžete stáhnout (ZIP) zde.

Povšimněte si prosím, že takto napsanou aplikaci není možné hladce ukončit z ovládacích panelů PocketPC.

Důvod je jednoduchý: pokud zavoláme modální (=blokující) dialog, je jeho rodič zablokován. Významem tohoto zablokování je zabránit uživateli interagovat s rodičovským oknem, je-li "nad ním" zobrazen dialog. Bohužel, je to právě ono rodičovské okno (v našem případě hlavní okno aplikace), kterému by byla zaslána zpráva WM_CLOSE, požadující ukončení aplikace.

Řešení je několik, ale nejjednodušší je přidat do každé funkce dialogu, v naší aplikaci zpracování zprávy WM_ERASEBKGND, při kterém opět "odblokujeme" hlavní okno aplikace:

case WM_ERASEBKGND: { HWND hOwner = GetWindow(hDlg, GW_OWNER); if(IsWindow(hOwner)) { EnableWindow(hOwner, TRUE); return FALSE; } } break;


Implementování společného mechanismu pro přepínání formulářů by byl vhodný základ pro vytváření multiplatformních aplikací; třeba tento příklad inspiruje některého čtenáře...


Příště ukončíme minisérii příkladem programování vícestránkových dialogů typu PropertySheet.





Nejčtenější

Ilustrační snímek
Úřad chce regulovat mobilní trh. Může to zlevnit volání a rychlá data

Podle Českého telekomunikačního úřadu na trhu nefunguje hospodářská soutěž. Regulaci však bude předcházet veřejná konzultace a následně analýza trhu. Výsledky...  celý článek

Huawei P10 Plus patří mezi nejlépe se prodávající modely značky
Huawei si jde za svým cílem. Apple by mohl sesadit už v tomto čtvrtletí

Společnost Huawei chce být v roce 2021 největším prodejcem smartphonů. Před sebou má dvě překážky - Apple a Samsung. V uplynulém čtvrtletí se však čínský...  celý článek

Motorola Moto X4
Toto je chystaná Moto X. Kdysi to bývala prémiovka

Řada Moto X bývala nejvyšší modelovou linií Motoroly, ale už loni tuto roli převzala kolekce Z. Nyní „xková“ řada hlásí návrat, ale model X4 nemíří na vrchol....  celý článek

rozbitý telefon
Revoluční patent: mobil si sám opraví prasklý displej

Zní to jako pořádné sci-fi, ale praskliny na displeji možná mobily v budoucnu opraví samy. Poslední patent Motoroly naznačuje, že se na takové technologii už...  celý článek

Nokia 8
Nejlepší Nokia 8 má skvělý výkon a je to první „obojíčkový“ smartphone

Nový vlastník značky Nokia konečně představil svůj top model. Novinka s označením 8 je špičkový smartphone, který ctí tradice. Nemá displej přes celé čelo, ale...  celý článek

Další z rubriky

Mobilní Messenger projde změnou, k nelibosti uživatelů v něm budou cílené...
Bez reklamy ani ránu. Bude už i na Facebook Messengeru v mobilu

Oblíbený mobilní kecálek se brzy promění. Facebook totiž do Messengeru po úspěšném testování implementuje cílené reklamy. Zobrazovat se budou na domovské...  celý článek

Ilustrační snímek
S těmito aplikacemi se o dovolené neztratíte. Najdou let i levný hotel

Místo slovníku, mapy a průvodce už řada lidí vyráží na dovolenou na neznámé místo jen se svým telefonem. V mnoha situacích je totiž neocenitelným pomocníkem....  celý článek

Ilustrační snímek
Facebook a Snapchat jsou zabijáci výkonu smartphonů s Androidem

Je jednou z nejčastěji instalovaných mobilních aplikací, současně však i jednou z těch, které nejvýrazněji ovlivňují výkon androidích smartphonů. Na rychlosti...  celý článek

Akční letáky
Akční letáky

Všechny akční letáky na jednom místě!

Najdete na iDNES.cz



mobilní verze
© 1999–2017 MAFRA, a. s., a dodavatelé Profimedia, Reuters, ČTK, AP. Jakékoliv užití obsahu včetně převzetí, šíření či dalšího zpřístupňování článků a fotografií je bez souhlasu MAFRA, a. s., zakázáno. Provozovatelem serveru iDNES.cz je MAFRA, a. s., se sídlem
Karla Engliše 519/11, 150 00 Praha 5, IČ: 45313351, zapsaná v obchodním rejstříku vedeném Městským soudem v Praze, oddíl B, vložka 1328. Vydavatelství MAFRA, a. s., je členem koncernu AGROFERT.