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

Zvláštním případem dialogů jsou vícestránkové dialogy typu PropertySheet. Jsou složeny z několika stránek, mezi kterými se můžeme přepínat pomocí záložek na vrchu nebo na spodku displeje.

Každá strana je definována jako vlastní dialog a může (ale nemusí) obsahovat vlastní funkci dialogu. Z jedné strany na druhou můžeme přecházet nejen kliknutím na záložku, ale i pomocí makra PropSheet_SetCurSel. Potřebujeme-li jednoduchou aplikaci založenou na několika dialozích mezi kterými se přepínáme, je velmi jednoduché využít právě PropertySheet.

Podobně jako voláme dialog pomocí funkce DialogBox, voláme PropertySheet pomocí funkce PropertySheet, které předáváme vyplněnou strukturu PROPSHEETHEADER. Struktura PROPSHEETHEADER musí být naplněna odkazem na všechny stránky, podobně jako v následujícím příkladu:

#define PAGES   4

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

	PROPSHEETPAGE psp;
	HPROPSHEETPAGE hpsp[PAGES];
	PROPSHEETHEADER psh;

// Pripravime si strukturu pro jednu stranku
	
	memset(&psp, 0, sizeof(PROPSHEETPAGE));
	psp.dwSize = sizeof(PROPSHEETPAGE);
	psp.dwFlags = PSP_DEFAULT;
	psp.hInstance = g_hInst;
	psp.pfnDlgProc = MainDlgProc;

// Vložíme první stránku
	
	psp.pszTemplate = MAKEINTRESOURCE(IDD_P1);
	hpsp[0] = CreatePropertySheetPage(&psp);

// Vložíme druhou stránku
	
	psp.pszTemplate = MAKEINTRESOURCE(IDD_P2);
	hpsp[1] = CreatePropertySheetPage(&psp);

// Vložíme třetí stránku

	psp.pszTemplate = MAKEINTRESOURCE(IDD_P3);
	hpsp[2] = CreatePropertySheetPage(&psp);

// Vložíme čtvrtou stránku - zatímco všechny předchozí strany měly
// stejnou funkci dialogu, čtvrtá stránka má navíc definovánu vlastní funkci
// dialogu  
	
	
	psp.pszTemplate = MAKEINTRESOURCE(IDD_P4);
	psp.pfnDlgProc = Page3DlgProc;
	hpsp[3] = CreatePropertySheetPage(&psp);

// Naplníme strukturu PROPSHEETHEADER

	memset(&psh, 0, sizeof(PROPSHEETHEADER));
	psh.dwSize = sizeof(PROPSHEETHEADER);
	psh.dwFlags = PSH_NOAPPLYNOW|PSH_MAXIMIZE|PSH_USECALLBACK;
	psh.hwndParent = GetDesktopWindow();
	psh.hInstance = g_hInst;
	psh.nPages = PAGES;
	psh.nStartPage = 0;
	psh.phpage = hpsp;
	psh.pfnCallback = PropSheetCallback;

	PropertySheet(&psh);
    return 0;
}

Nesmíme zapomenout volat funkci InitCommonControls, která v naší aplikaci inicializuje rozšířené ovládací prvky uživatelského rozhraní, mezi které PropertySheet patří.

Vzhled PropertySheet můžeme nastavit ve funkci PropSheetCallback, jejíž adresu vkládáme do struktury PROPSHEETHEADER. Pokud funkci PropSheetCallback neuvedeme, použije operační systém PocketPC starší verzi dialogu se záložkami nahoře

Nová verze Stará verze
static int CALLBACK 
PropSheetCallback(HWND, UINT, LPARAM)
{
    switch(message) 
    {
        case PSCB_GETVERSION:
            return COMCTL32_VERSION;
	}

	return 0;
}
static int CALLBACK 
PropSheetCallback(HWND, UINT, LPARAM)
{
    switch(message) 
    {
        case PSCB_GETVERSION:
            return 0;
	}

	return 0;
}
  Tato varianta se použije, i když funkci PropSheetCallback neuvedeme.

Každá stránka může mít vlastní obslužnou funkci, která zpracovává zejména zprávy WM_INITDIALOG a WM_COMMAND (také může mít více stránek stejnou obslužnou funkci). Tato funkce může být dosti mnimalistická:

int CALLBACK Page3DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_INITDIALOG:
            CreateRpCommandBar(hDlg);
            return TRUE;

        case WM_COMMAND:
            if(LOWORD(wParam) == IDC_BUTTONP1)
            {
                PropSheet_SetCurSel(GetParent(hDlg), NULL, 0);
                return TRUE;
            }
            break;
			
        default:
            break;
    }

    return FALSE;
}

Příklad použití vícestránkového dialogu si můžete stáhnout (ZIP) zde. Jednoduchou aplikaci na házení kostkami, která využívá právě ProperySheet si získáte tady.

Závěr

Pro řadu jednoduchých programů je velmi pohodlné využít právě aplikace založené na dialogu. Ukázali jsme si, že prostředky, které můžeme použít v dialozích mohou být velmi různorodé, a že programátor zvyklý na styl přepínání formulářů PalmOS může toto chování realizovat i v aplikaci pro PocketPC právě pomocí aplikací založených na dialozích.

Doufám, že jste se při čtení článků bavili a že jsem alespoň některé z vás inspiroval, abyste vyzkoušeli programování PocketPC.


Témata: MEMS