Neměl by to být klasický výukový seriál, jehož primárním cílem je něco (dopodrobna teoreticky) vysvětlit. Nemyslím si, že bych dosáhl takové úrovně, abych mohl někoho učit. Tento seriál berte jako námět, jak se daná věc dá také dělat. A jeho výsledkem by měla být spíše tvorba "užitečného kódu", který se může hodit a lze ho dále (opakovaně) využít. Jednotlivé díly by tak měly obsahovat více programového kódu než psaného textu (snad bude první díl v tomto ojedinělou výjimkou).
O čem tento seriál vlastně bude?
Výsledkem seriálu by měla být "opravdová GUI aplikace" pro Windows, co dělá nějakou "užitečnou činnost". Začneme si vytvářet knihovnu znovupoužitelných tříd, pomocí kterých vytvoříme následně aplikaci, která demonstruje funkci a následně bude i nějakým způsobem užitečná. A pokud bude dostatek síly, času a zájmu, tak se dostane i na COM.
Předpokládám znalost jazyka C++, objektového programování (dále jen OOP) a Win32 API (dále jen API). O těchto tématech na serveru existují seriály. Projekty budou vytvářeny v MSVS 2008. Protože kód nebude nijak významně závislý na použitém IDE, tak by měl být po malých úpravách použitelný i jinde.
Nejprve si nastíníme problém. Chceme vytvořit GUI aplikaci pro Windows v C++. K tomu můžeme použít různé knihovny: MFC, ATL, VCL a mnoho dalších. Každá má svoje klady i zápory a diskuze na toto téma (která by byla plamenná asi tak stejně jako neplodná :)) by jistě neměla vítěze.
Nakonec všechny tyto knihovny ve větším či menším rozsahu využívají služeb API. Tak proč nepsat aplikace přímo s využitím jen API? Už jenom z principu musí být taková aplikace rychlejší, nezanáší se do ní další chyby (stačí ty v API a naše :)) atd. Důvody jsou vlastně pořád stejné a platí už od dob "přechodu" z assembleru na C.
Pro většinu je prvním důvodem čas strávený nad samotnou tvorbou aplikace. Trávit hodiny tvorbou GUI, reakce na události atd., když to v nějakém lepším IDE mohu mít za několik minut... Stále do kola programovat ty samé věci (např. smyčka zpráv). Druhým důvodem je složitost a obsáhlost API. Pokud nevíte, co chcete najít, tak to v MSDN budete hledat těžko nebo alespoň poměrně dlouho (což jsme zase u času a potažmo u peněz).
Tak jsem na úvod seriálu napsal dva důvody, proč by ani neměl vzniknout :), ale je to stejné jako u již zmiňovaného assembleru - pořád je pár bláznů, co na to "svoje" nedají dopustit (i když v případě assembleru to někdy ani jinak nejde). Takže vytrváme a vytvoříme aplikaci pouze s využitím API.
GUI aplikace pro Windows musí mít několik náležitostí (samozřejmě myšleno v C++ s využitím API):
- vstupní bod aplikace (WinMain)
- smyčku zpráv
- funkci na zpracování příchozích zpráv (WindowProc)
Následně se "pouze" doprogramují menu, dialogy, reakce na zprávy, práce se soubory, samotný kód atd. Čím složitější a košatější je tvořená aplikace, tím je těchto maličkostí více a více.
Časem se ukáže, že některé části jsou pořád stejné nebo se opakují, a to nejenom v jednotlivých aplikacích, ale i v rámci jedné aplikace. Možná i to byl důvod, proč vznikla knihovna MFC, a je to také jeden z důvodů vzniku knihovny, která je námětem tohoto seriálu.
Půjdeme na to tedy od lesa a než se dostaneme k tvorbě nějaké aplikace, tak si knihovnu, která by nám usnadnila práci s API, vytvoříme. V tomto díle pouze založíme knihovnu, která bude exportovat vytvořené třídy. Začneme minimálním rozsahem. Knihovna bude zatím obsahovat pouze jednu třídu, od které budou všechny další přidávané dědit. Tato třída má název CMyObject.
Co budou mít všechny další třídy společného? Vzhledem k tomu, že není ani jasné, kolik jich bude a jaký bude rozsah, tak nemohou mít společného nic. To znamená, že třída obsahuje pouze konstruktor (neveřejný - instance této třídy nikdo vytvářet nebude) a destruktor. Dále může obsahovat diagnostické nástroje API - zatím si vystačíme s funkcí OutputDebugString, která je definována jako statická (což umožní použití i bez objektu).
Jedinou změnou proti klasické definici třídy je označení pro export z knihovny:
class __declspec(dllexport) CMyObject
Takto budou označeny všechny třídy, které do knihovny vložíme.
Aplikace z článku ke stažení.
Pokračování příště...