Premium

Získejte všechny články
jen za 89 Kč/měsíc

Programování PocketPC naruby (11/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 kontextové nabídce a synchronizaci dat.
Dnešním dílem seriálu Programování naruby navážeme na předchozí část věnovanou uživatelskému rozhraní a dialogu nastavení.

Kontextová nabídka

Jednou z novinek ve Windows CE 3.0 (jak nás upozorňuje průvodce po spuštění zařízení) je zavedení kontextové nabídky. Přidržíme-li stylus na jednom místě displeje, zobrazí se časovač (červené tečky obíhající hrot stylusu) a po nějaké době se zobrazí kontextová nabídka.

Zobrazení kontextové nabídky je ve všech verzích Microsoft Windows stejné, a to voláním funkce TrackPopupMenuEx, podobně jako v následujícím rámečku:


void ShowContextMenu(HWND hwnd, UINT x, UINT y)
{
    HMENU hmMenu = CreatePopupMenu();

    AppendMenu(hmMenu, MF_STRING, IDM_DELETEITEM, TEXT("Delete"));
    AppendMenu(hmMenu, MF_STRING, IDM_SWITCHICON, TEXT("Change icon"));

    TrackPopupMenuEx(hmMenu, 0, x, y, hwnd, NULL);

    DestroyMenu(hmMenu);
}

Pokud programujeme vlastní ovládací prvky, tak nám stačí zavolat funkci SHRecognizeGesture při zpracování události WM_LBUTTONDOWN. Parametrem funkce SHRecognizeGesture můžeme zvolit, zda tato funkce hodnotu GN_CONTEXTMENU vrátí, nebo zda ji odešle hlavnímu oknu aplikace jako upozornění pomocí zprávy WM_NOTIFY.

V aplikacích, které využívají standardní ovládací prvky Windows je však hlavnímu oknu aplikace odesíláno upozornění GN_CONTEXTMENU na zobrazení kontextové nabídky automaticky. Proto stačí doplnit do obsluhy události WM_NOTIFY následující řádek:


LRESULT MainWindowProc_Notify(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
    int code = ((LPNMHDR)lParam)->code;

    if(((LPNMHDR)lParam)->hwndFrom == g_hwndList)
    {
        ....
        else if(code == GN_CONTEXTMENU)
        {
            ShowContextMenu(hwnd, ((NMRGINFO*)lParam)->ptAction.x, ((NMRGINFO*)lParam)->ptAction.y);
        }
    }

    return 0L;
}

Přidržíme-li stylus nad nějakou položkou displeje delší dobu, zobrazí se jednoduchá kontextová nabídka, která umožní vybrat ze dvou možností. Pokud některou z nabízených možností využijeme, je hlavnímu oknu odeslána příslušná zpráva WM_COMMAND.

Synchronizace dat

V řadě případů potřebujeme, aby naše aplikace reagovala na nějakou systémovou událost, například na ukončení synchronizace. Operační systém Windows CE nabízí funkci CeRunAppAtEvent, která zajistí spuštění aplikace při uvedené události, například při změně systémového času nebo při ukončení synchronizace.

Je-li aplikace spuštěna automaticky, je jí na příkazové řádce předán parametr, kterým je předdefinovaný textový řetězec. Aplikace nesmí v takovém případě zablokovat systém a neměla by ani spouštět svoji kopii. Ve většině případů aplikace testuje, zda již neběží v pozadí. Pokud ano, pošle hlavnímu oknu dříve spuštěné aplikace zprávu, která způsobí například aktualizaci dat po ukončení synchronizace.

Jakmile si aplikace již nepřeje být spouštěna při dané události, odregistruje se voláním funkce CeRunAppAtEvent s parametrem NOTIFICATION_EVENT_NONE.

V naší aplikaci potřebujeme reagovat na událost konce synchronizace jen tehdy, je-li aplikace spuštěna, například v pozadí. V takovém případě potřebujeme znovu načíst datový soubor; jinak by mohlo dojít k jeho neúmyslnému přepsání.


int WINAPI WinMain(HINSTANCE hInstance, 
                   HINSTANCE hPrevInstance, 
                   LPTSTR lpCmdLine, 
                   int nCmdShow)
{
    ...

    HWND hwndMain = FindWindow(g_szClass, szName);

    if(wcscmp(lpCmdLine, APP_RUN_AFTER_SYNC) == 0)
    {
        if(hwndMain) // Pokud je spuštěna předchozí instance aplikace
        {
            SendMessage(hwndMain, MWM_RELOAD, 0, 0L);
            return 0;
        }
    }
    else 
    {
        if(hwndMain)
        {
            SetForegroundWindow(hwndMain);
            return 0;
        }
    }

    ...

    // registrace k přijímání zprávy
    
    TCHAR myname[MAX_PATH];
    GetModuleFileName(g_hInstance, myname, MAX_PATH);
    CeRunAppAtEvent(myname, NOTIFICATION_EVENT_SYNC_END);

    ... registrace a vytvoření okna ...    

    ShowWindow(hwndMain, nCmdShow); 

    ... smyčka zpracování událostí ...

    // zrušení registrace před ukončením programu
    
    CeRunAppAtEvent(myname, NOTIFICATION_EVENT_NONE);

    return 0;
}

Zase vše propojíme

Teď již máme navrženou plnohodnotnou Pocket PC aplikaci, která je (byť velmi omezeně) schopna synchronizovat data se stolním počítačem. Tento příklad snad demonstroval, že vytváření aplikací pro Microsoft Windows, včetně jajich kapesní verze, je v základech velmi podobné; liší se pouze některé techniky, které jsou však poměrně podrobně zdokumentovány.

Jednotlivé soubory získáte kliknutím na následující ikony (programy v ZIP archivu):

Zde můžete stáhnout zdrojové texty programu, určené pro Microsoft Embedded Visual C++ 3.0.
Zde můžete stáhnout spustitelný soubor.

Závěr

Děkuji všem čtenářům, že měli dostatek trpělivosti a dostali se až na konec minisérie. V příštím dílu bude jejich odměnou automatický generátor aplikací pro Pocket PC a Embedded Visual C++ 3.0. Screenshot, který vás má navnadit a který ilustruje vytvoření položky do obrazovky Today , si můžete prohlédnout zde:

  • Nejčtenější

Chtěla si vyfotit selfie s parní lokomotivou. Bylo její poslední

7. června 2024  7:02

Selfie s projíždějící parní lokomotivou stálo mladou ženu z Mexika život. Na sociálních sítích...

Výrobci si nařízení Unie vyložili po svém. A zákazníky to stojí peníze

8. června 2024

Premium Výrobci mobilních telefonů v uplynulých letech odstranili z balení s přístroji nabíjecí adaptéry....

{NADPIS}

{LABEL} {POPISEK}

Vodafone láká na výhodná neomezená data. Jen dočasně, ale slevu dá nastálo

13. června 2024  7:02

Ještě pár dní lze u Vodafonu získat jeho datově neomezený tarif s nejvyšší omezenou rychlostí o pár...

Tak levný supersmartphone jinde nepořídíte. Test Motoroly Edge 50 Ultra

9. června 2024

Modely s přívlastkem Ultra jsou většinou záležitostí té nejvyšší cenové kategorie. Ne však u...

{NADPIS}

{LABEL} {POPISEK}

Seberu vám iPhony a zavřu je do klece. Elon Musk se opřel do Applu

11. června 2024  11:34

Krátce po odhalení nové umělé inteligence určené pro zařízení Applu se na sociální síti X ohradil...

V40 jako parťák na léto. Nejodolnější telefon od vivo je vybaven fotografií ZEISS

14. června 2024

Advertorial Společnost vivo uvádí na trh nové modely z řady V40, které doslova mění pravidla střední třídy....

Umělá inteligence táhne. Nové samsungy jsou hit

14. června 2024  7:02

Samsung začátkem letošního roku představil novou generaci svých smartphonů, které využívají umělou...

O jednostranné změně tarifu musí operátor informovat. Včas a srozumitelně

14. června 2024

V souvislosti s již probíhajícími či v nejbližší době chystanými změnami některých tarifů u...

Vodafone láká na výhodná neomezená data. Jen dočasně, ale slevu dá nastálo

13. června 2024  7:02

Ještě pár dní lze u Vodafonu získat jeho datově neomezený tarif s nejvyšší omezenou rychlostí o pár...

Svatý grál na ekzém a suchou pokožku u dětí
Svatý grál na ekzém a suchou pokožku u dětí

Produkty Atoderm od značky Bioderma jsou skvělou volbou pro péči o citlivou a suchou nebo atopickou pokožku. Slibují nejen hloubkovou hydrataci,...

Nová Miss Alabama je morbidně obézní. Vítězka váží 150 kilo, lidé se bouří

Vítězkou v soutěži National American Miss je Sara Millikenová. Třiadvacetiletá žena byla zvolena královnou krásy i...

Do Itálie se nevrátím, tady vše funguje lépe, říká dcera Petra Hapky

Dcera slavného českého hudebníka Petra Hapky (†70) Petra (41) žila od 3 let s matkou v italském Římě. Ve 29 letech se...

Koupil byt i s nájemníkem a zdražil o sedm tisíc. Chce výnos 4,5 procenta

Seriál Našel jsem si nájemní byt, ve kterém bydlím několik měsíců. Platím 17 tisíc korun za nájem a k tomu měsíční poplatky za...

Čekám na transplantaci, ale dám přednost mladým, říká herec Zdeněk Žák

Herec Zdeněk Žák (71) si nikdy moc nepřipouštěl své zdravotní problémy. Nemoci přecházel a k doktoru se nehnal, až...

Za srážku vlaků únava nemohla, ukázalo šetření. Strojvůdce si chybu uvědomil

Strojvedoucí havarovaného rychlíku RegioJet, v kterém minulý týden zemřeli v Pardubicích čtyři lidé, si těsně před...