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ů.
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:
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ísová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_CREATE | vytvoření okna |
WM_CLOSE | uzavření okna uživatelem |
WM_DESTROY | rušení okna |
WM_PAINT | potřeba překreslit klientskou (vnitřní) část okna |
WM_CHAR | znak dodaný z klávesnice |
WM_KEYDOWN | stisknutí klávesy |
WM_KEYUP | uvolnění klávesy |
WM_LBUTTONDOWN | stylus přiložen na displej |
WM_LBUTTONUP | stylus uvolněn (zvednutí nad obrazovku) |
WM_MOUSEMOVE | stylus tažen po obrazovce |
WM_TIMER | zpráva od časovače |
WM_SIZE | změna velikosti okna |
WM_VSCROLL | posunutí vertikálního posuvníku |
WM_COMMAND | byla 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:
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í.
Stránka načtena za 0.0019 sekund.