Kurz1 - Kapitola5

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

2.6 Procedura okna

Při procházení zdrojového kódu, který nám připravil AppWizard v souboru Nazdar.cpp nám zbývají probádat jenom dvě funkce. My se zaměříme pouze na rozsáhlejší WndProc. Menší funkce About je zjednodušenou variantou WndProc a slouží k obsloužení okna vyvolaného po kliknutí na položku About v menu. Zatím nás bude zajímat hlavní okno našeho programu, spokojíme se tedy s konstatováním, že procedura About je menší příbuznou WndProc a vztahuje se k oknu "About".
Procedura WndProc nám zůstala na konec, ale významově se řadí na čelné místo. Programový kód, který jsme procházeli doposud, je sice také důležitý, ale lze říci, že je shodný nebo alespoň velmi podobný ve spoustě jednoduchých programů. Opakuje se, a proto ho téměř nikdo nepíše, natož aby si jej pamatoval. Je jednodušší jej zkopírovat nebo nechat AppWizard, aby ho vygeneroval za nás... :-)
Proč je funkce WndProc tak důležitá?
Odpověď by mohla být jednoduchá - protože se musí postarat téměř o všechno ve vašem programu.
V minulém díle jsme zmínili, že třída okna musí mít proceduru okna. Procedura okna je funkce, které Windows předávají zprávy (rozuměj události) týkající se daného programu - tedy okna. Jinak řečeno - procedura okna je styčný bod s vaším programem pro operační systém Windows.
Všechny události jsou funkci, označené při registraci třídy okna jako její procedura, předány pomocí čtyř parametrů.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
První parametr hWnd je handle okna, kterého se zpráva týká. Druhý parametr message je číslo identifikující zprávu. Protože např. zpráva "kliknutí myši" by byla nedostatečná - nevíme, kde v okně kliknutí nastalo - je zpráva doplněna dalšími dvěmi čísly. Parametry wParam a lParam upřesňují předávanou zprávu. Co tyto parametry budou obsahovat, závisí na každém typu zprávy.
I když je zpráva definována jako číslo (unsigned int), v praxi tato čísla znát nemusíte. Pro Windows API jsou zprávy definovány pomocí symbolických jmen jako např. WM_PAINT.
Jestliže procedura okna obdrží zprávu ke zpracování, musí na ni odpovídajícím způsobem reagovat. Protože tyto zprávy mohou být různého typu, je nutné téměř pro každou z nich provést jinou akci. Rozhodnutí, jaká zpráva přišla a co se má vykonat, je možné zajistit programově různými způsoby. K nejběžnějším a také nejčastěj používaným v jednoduchých programech patří příkaz switch. Procedura okna má pak následující obsah:
    switch (message)
{
case WM_ZPRAVA1:
// zde se zpracuje WM_ZPRAVA1
return 0;
case WM_ZPRAVA2:
// zde se zpracuje WM_ZPRAVA
return 0;
case WM_ZPRAVA3:
// zde se zpracuje WM_ZPRAVA3
return 0;

// ... atd. pro všechny obsluhované zprávy

}
return DefWindowProc(hWnd,message,wParam,lParam);
Pro rozsáhlé projekty by byl jeden příkaz switch nepřehledný, proto se používají jiné programové postupy. Pro náš účel je ale switch plně vyhovující.
Do těla příkazu switch vložíme zpracování pouze těch zpráv, o které máme zájem, zakončené příkazem return pro ukončení procedury okna. Protože Windows předávají oknu všechny zprávy patřící do jeho oblasti, dostáváme do procedury okna i zprávy, o které nemáme zájem. Ve Windows musí být všechny zprávy zpracovány. Z tohoto důvodu je nutné za příkaz switch vložit volání funkce DefWindowProc určené ke zpracování pro nás nezajímavých zpráv. Funkci DefWindowProc, jejíž návratovou hodnotu vracíme z procedury okna, musíme do těla naší procedury okna zařadit!
Zprávy jsou dvojího druhu - řazené a neřazené. Řazené zprávy jsou umísťovány do fronty a postupně předávány proceduře okna (především jde o aktivity uživatele při obsluze programu). Neřazené zprávy jsou zasílány přímo. V následující tabulce je uvedena ukázka několika nejběžnějších zpráv:
WM_CREATEvytvoření okna
WM_CLOSEuzavření okna uživatelem
WM_DESTROYrušení okna
WM_PAINTpotřeba překreslit klientskou (vnitřní) část okna
WM_CHARznak dodaný z klávesnice
WM_KEYDOWNstisknutí klávesy
WM_KEYUPuvolnění klávesy
WM_LBUTTONDOWNstylus přiložen na displej
WM_LBUTTONUPstylus uvolněn (zvednutí nad obrazovku)
WM_MOUSEMOVEstylus tažen po obrazovce
WM_TIMERzpráva od časovače
WM_SIZEzměna velikosti okna
WM_VSCROLLposunutí vertikálního posuvníku
WM_COMMANDbyla vybrána položka nabídky (menu)
V příkladu vygenerovaném AppWizardem jsou v proceduře okna zpracovány pouze čtyři zprávy. V úvodním komentáři jsou tři z nich vypsány včetně jejich krátkého popisu:
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
WM_COMAND je vyvolána při vybrání nabídky menu. V případě Help->About vyvolá dialog "About", ve druhém případě File->Exit volá funkci DestroyWindow, která zašle zadanému oknu (svému programu) zprávu WM_DESTROY. Při zpracování této zprávy se provede "úklid", což v této ukázce znamená zrušení nabídkového pruhu z paměti a také se volá funkce PostQuitMessage(0). Jejím úkolem je vložit další zprávu WM_QUIT do programové fronty zpráv a tím i přerušení smyčky zpráv.
Zpráva WM_PAINT je volána při požadavku na vykreslení klientské části okna. V našem případě se jako odpověď na ni vypisuje doprostřed okna požadovaný pozdrav.
V popisu chybí WM_CREATE. Zpracováním této zprávy se obvykle provádí inicializace potřebných proměnných a částí programu. Ve Windows CE je to např. velmi vhodná příležitost pro vytvoření pruhu nabídky - menu. V předcházejícím dílu jste byli upozorněni, že při programování pro Windows CE se programátor musí o nabídky postarat sám a nabídkový pruh po zobrazení okna nechat vykreslit. Vykreslení pomocí funkce ShowCommandBar se provede na základě handle získaného při vytváření nabídky zpracováním zprávy WM_CREATE.
Povšimněte si, že na konci procedury okna nechybí "sběrač" všeho ostatního - funkce DefWindowProc(), která zpracuje všechny zbývající možné zprávy.
V příštím dílu se ještě vrátíme ke zprávě WM_PAINT a pokusíme se trochu upravit její zpracování.

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

  • Jednou z nejdůležitějších části programu pro Windows CE je procedura okna.
  • Úkolem procedury okna je zpracovávat zprávy získané od operačního systému.
  • Zpráv je mnoho druhů, jejich názvy začínají písmeny WM_...
  • Nezpracované zprávy v proceduře okna musíme předat funkci DefWindowProc.
  • Zprávy jsou do procedury okna předávány pomocí 4 parametrů.
 

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.