Kurz1 - Kapitola4

17. června 2007 v 16:11 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

2.5 Části Windows CE programu "Nazdar"

V minulém díle jsme si něco řekli o způsobu fungování programu pro Windows, o jeho smyčce zpráv. Nyní bychom měli projít ve stručnosti další část programu. Otevřete si program Nazdar (File -> Recent Workspaces -> C:\Pokusy\Nazdar\Nazdar) a pokud jej nemáte zobrazený, tak do panelu editoru otevřete soubor Nazdar.cpp.
Na obrázku č. 9 v předchozím díle je znázorněna struktura běžného programu. Zatímco smyčka zpráv složená ze čtyř funkcí na diagramu zabírá tři bloky, zbytek programu je uschován v jediném bloku nazvaném "Inicializace". Při pohledu do souboru Nazdar.cpp se na první pohled zdá, že jde o nějaký omyl. Čtyři řádky programu zabírají 75% obrázku a zbytek toho rozsáhlého programu se musí vtěsnat do jediného bloku?
Pokusíme se to rozmotat... :-)
Najděte si ve zdrojovém kódu už známou funkci WinMain.
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HACCEL hAccelTable;

// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_NAZDAR);

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return msg.wParam;
}
Při pohledu na toto tělo programu se to již jeví reálné. Po první funkci InitInstance, u které je otestováno úspěšné ukončení, a po funkci LoadAccelerators (připravuje data pro TranslateAcelerators) již objevíme příkazy patřící smyčce zpráv. Tohoto zjednodušení je dosaženo díky zabalení inicializačních příkazů do funkce InitInstance. Jejím úkolem je provést několik akcí:

obr. 12 Inicializace programu
Každé okno na obrazovce Windows je založeno na nějaké třídě okna. Třída okna definuje proceduru okna (viz dále) a některé další charakteristiky oken, která se mohou podle této třídy vytvořit. Zjednodušeně si lze představit, že Windows nejsou schopny vytvořit na obrazovce okno bez toho, aniž by pro toto okno byla k dispozici šablona (nebo ještě jinak - střih, podle kterého je možné okno "ušít").
Třídu okna je možné zaregistrovat funkcí RegisterClass.
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_NAZDAR));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;

return RegisterClass(&wc);
}
V našem případě je tato funkce zabalena do funkce MyRegisterClass. Parametrem funkce je struktura typu WNDCLASS. Její jednotlivé položky je možné objevit v Helpu. Povšimněte si pouze wc.lpfnWndProc určující proceduru okna.
Vrátíme se zpět do funkce InitInstance - sledujte ji v programu.
Po registraci okno vytvoříme voláním funkce CreateWindow. Tato funkce kupodivu nezobrazí požadované okno na displeji. Jejím úkolem je vytvořit místo v paměti a uložit zde potřebné informace o okně. Následuje jednoduchý test, jestli funkce CreateWindow opravdu vytvořila požadované okno a vrátila handle (něco jako ukazatel nebo pořadové číslo).
Úspěšné vytvoření okna nám umožní jeho vykreslení na displeji. Tu část programového okna, o kterou se starají Windows (např. rám kolem vyhrazené plochy), je možné zobrazit pomocí funkce ShowWindow.
Druhým úkolem je vykreslit do klientské oblasti okna uživatelské informace jedinečné pro každý programátorský výtvor. To zajišťuje funkce UpdateWindow zasláním zprávy WM_PAINT proceduře okna (bude vysvětleno v příštím dílu).
Po provedení obou vykreslovacích funkcí by mělo být okno programu na displeji a inicializační část by mohla skončit. V programu pro Windows 95 nebo Windows NT to tak skutečně bývá. Ve Windows CE nám ale kousek programu nadbývá:
   if (hwndCB)
CommandBar_Show(hwndCB, TRUE);

Funkce CommandBar_Show má za úkol zobrazit nabídkový neboli menu pruh patřící tomuto programu. Windows 95 nebo Windows NT dokážou obstarat nabídku už ve funkci RegisterClass nastavením položky wc.lpszMenuName. Windows CE to neumí, takže se o zpracování nabídky musíme postarat sami. Po otestování, zda existuje handle nabídky (nabídka je již vytvořena v paměti), je zavolána funkce pro zobrazení nabídkového pruhu.

Co bychom si měli z této lekce zapamatovat?

  • Inicializace programu pro Windows CE vyžaduje několik kroků.
  • Windows vytvářejí okno na základě zaregistrované třídy okna.
  • Okno vytvoříme a zobrazíme pomocí funkcí CreateWindow a ShowWindow.
  • Vnitřní (klientská) část okna je vykreslena voláním procedury okna.
  • Ve Windows CE se musíme postarat o vytvoření a vykreslení nabídkového pruhu - "Menu".
 

Buď první, kdo ohodnotí tento článek.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.