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.