Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Učíme se Win API - 4.
winapi_logo
28. ledna 2002, 00.00 | V tomto pokračování se již dočkáme spuštění kompletní, byť té nejjednodušší aplikace, která má všechny základní náležitosti programu pro Windows.
Minulý článek jsme zakončili vytvořením hlavního okna aplikace pomocí funkce CreateWindowEx o které si nyní řekneme trochu podrobněji.
|
dwExStyle - rozšířený styl. Tímto parametrem se tato funkce liší od své starší předchůdkyně CreateWindow. Spolu s Win32 totiž přibylo několik nových stylů a z důvodu zpětné kompatibility kódu nebylo možné rozšířit počet parametrů funkce CreateWindow, proto byla vytvořena tato rozšířená funkce. Podobných dvojic funkcí existuje více ze stejného důvodu. Úplný výčet možných hodnot je v dokumentaci, řekněme si například, že hodnota WS_EX_TOPMOST specifikuje, že okno bude "vždy navrchu".
lpClassName - jméno registrované třídy, ke které má okno náležet. Může to být některá systémová třída, jako "BUTTON", "LISTBOX" apod. nebo třída zaregistrovaná naší aplikací.
lpWindowName - jméno (text) okna. Každé okna má nějaký text okna (může být samozřejmě "prázdný"), který se u některých typů oken zobrazí. U běžného hlavního okna se tento text zobrazí v titulkovém pruhu, u tlačítka je to jeho "popisek", u edit-boxu jeho vlastní obsah apod.
dwStyle - styl okna. Parametr, resp. kombinace příznaků určujících vlastnosti okna, jako například, zda má hlavní nabídku, které ze systémových ikony, zda jej lze roztahovat tažením za okraj a pod. V našem případě jsme použili hodnotu WS_OVERLAPPEDWINDOW, která představuje okno "se všemi náležitostmi", tedy roztažitelným okrajem, systémovými ikonami v titulkovém pruhu atd. Postupně si ukážeme jak modifikovat vlastnosti okna.
x, y - souřadnice levého horního rohu okna na obrazovce.
nWidth - šířka okna
nHeight - výška okna
hwndParent - handle okna předka ("rodičovské okno"). Týká se to především prvků jako edit, button apod. které jsou umístěny na jiném "běžném" okně. V případě hlavního okna aplikace samozřejmě zadáme hodnotu NULL.
hMenu - handle menu nebo identifikátor okna potomka. U hlavního okna aplikace můžeme zde nastavit hlavní menu aplikace. Pokud je toto menu určeno při registraci třídy, můžeme nechat NULL. O vytvoření menu si samozřejmě řekneme později. Pokud jde o "dětské" okno, typicky již zmíněné buttony nebo edit-boxy, pak zde můžeme uvést identifikátor tohoto prvku, který nám pak umožní při přijímání zpráv od těchto prvků tyto prvky rozlišit. Ale jak uvidíme, identifikátor není nutné používat, i když hlavně u dialogů, je to běžné, prvky budeme moci rozlišit i s použitím handle.
hInstance - handle instance, které dostaneme jako 1. parametr funkce WinMain
lpParam - ukazatel na případná další data, která mohou být vytvořena spolu s oknem. Pokud vytvořené okna má být MDI oknem, tato data obsahují adresu struktury MDICREATESTRUCT, obsahující vlastnosti MDI okna.
Tolik tedy zatím k funkci CreateWindowEx. A nyní se dostáváme k poslední základní části Win32 programu, kterou je procedura okna. Když jsme si popisovali smyčku zpráv, říkali jsme si o funkci DispatchMessage. Tato funkce posílá zprávy vyjmuté ze smyčky zpráv aplikace do procedury příslušného okna, neboť ve frontě zpráv jsou zprávy náležící všem oknům aplikace, ale v proceduře okna pouze zprávy náležící oknu nebo oknům, patřícím k té třídě, která si tuto proceduru okna "zaregistrovala". Procedura okna má následující tvar:
|
hwnd - handle okna. Tento parametr potřebujeme, pokud máme více oken patřících stejné třídě, které mají společnou proceduru okna. V tom případě nám tento parametr určí, kterému z těchto oken je příslušná zpráva určena.
uMsg - identifikátor zprávy. Jedna z hodnot, definovaných v standardních hlavičkových souborech Windows (většinou ve <windows.h>), určující o jakou zprávu se jedná. Například již zmíněné zprávy WM_QUIT nebo WM_LBUTTONDOWN.
wParam - 1. parametr zprávy, 32-ti bitové číslo nesoucí informace specifické pro danou zprávu.
lParam - 2. parametr zprávy, stejně jako wParam 32-ti bitové číslo, které může obsahovat další informace.
Přidejme si nyní do našeho programu následující "minimální" implementaci procedury okna:
|
Jak již asi tušíte, podstata zpracování zpráv v proceduře okna spočívá v tom, že zprávy, na které chceme nějak reagovat, zachytáváme v jednom více či méně obsáhlém příkazu switch. Všechny zprávy (včetně těch, na které nějak reagujeme), s výjimkou případů, kdy chceme z nějakého důvodu některou zprávu zadržet, musíme odeslat k výchozímu zpracování pomocí funkce DefWindowProc. Tato funkce má stejnou strukturu jako procedura okna (WindowProc), což pro nás znamená jednoduše předat parametry získané v proceduře okna této funkci.
Dále ve výpisu kódu vidíte, že ve "filtru zpráv" máme uvedenou jedinou zprávu, kterou je WM_DESTROY. Tato zpráva je poslána oknu jako jakési "poslední rozloučení". Znamená, že okno je právě rušeno a v okamžiku doručení zprávy je již odstraněno z obrazovky. Jako reakci na tuto zprávu musíme do smyčky zpráv "ručně" vložit zprávu WM_QUIT. Toto nenjednodušším způsobem realizujeme funkcí PostQuitMessage, jejímž jediným parametrem je návratový kód, který chceme nastavit. Tento kód je pak parametrem wParam zprávy WM_QUIT a ve smyčce zpráv bychom jej mohli získat jako prvek wParam struktury MSG, kterou nám naplní funkce GetMessage ve smyčce zpráv.
A nyní konečně máme kompletní ten nejednodušší kód, realizující skutečnou Win32 aplikaci s hlavním oknem, které má všechny náležitosti běžného okna Windows. Samozřejmě nemá vlastní specifickou ikonu, menu ani žádné další prvky, jako třeba edit-box pro vstup textu apod. Po spuštění dostaneme takovýto výsledek:
Uvedu zde ještě pro přehlednost úplný výpis kódu:
|
Příště budeme náš program postupně dále rozvíjet. Řekneme si něco o UNICODE (s tím souvisí makro TEXT použité v kódu), ukážeme si jak vypisovat text přímo na plochu okna - seznámíme se tedy s GDI, grafickým rozhraním Windows.
Zde je ke stažení projekt (Visual C++ 6) v aktuální fázi vývoje, který ukazuje výše uvedený výpis kódu: win_api_4.zip.
Obsah seriálu (více o seriálu):
- Učíme se Win API - motivační úvod
- Učíme se WinAPI - Začínáme
- Učíme se WinAPI - 3.
- Učíme se Win API - 4.
- Učíme se Win API - 5.
- Učíme se Win API - 6.
- Učíme se Win API - 7.
- Učíme se Win API - 8
- Učíme se Win API - 9.
- Učíme se Win API - 10.
- Učíme se Win API - 11.
- Učíme se Win API - 12.
- Učíme se Win API - 13.
- Učíme se Win API - 14.
- Učíme se Win API - 15.
- Učíme se Win API - 16.
- Učíme se Win API - 17.
- Učime se Win API - 18.
- Učime se Win API - 19.
- Učime se Win API - 20.
- Učime se Win API - 21.
- Učime se Win API - 22.
- Učime se Win API - 23.
- Učime se Win API - 24.
- Učíme se Win API - 25.
- Učíme se Win API - 26.
- Učíme se Win API - 27.
- Učíme se Win API - 28.
- Učíme se Win API - uživatelsky kreslený ListBox
- Učíme se Win API - uživatelsky kreslený ListBox II
- Dialog výběru složky a naplnění ListBoxu soubory
- Vyhledávání souborů - zjištění obsahu složky
- Pracujeme s ComboBoxem ve WinAPI
- Pracujeme s ComboBoxem II.
- Rozšířený prvek ComboBoxEx
- Ovládací prvek TrackBar
- Ovládací prvek Progress Bar
Diskuse k článku
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007