Kurz3 - Kapitola3

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

5.3 Jak to funguje?

Jestliže vám program z minulého dílu úspěšně pracuje, nastal čas, abychom se podívali, jakým kouzlem se to vlastně stalo. Dnes si pouze rozebereme, co jsme minule napsali.
V úvodu k MFC bylo napsáno, že knihovna MFC připravuje programátorovi nejčastěji prováděné akce. Protože rozhraní našeho programu představuje běžný dialog s okny vlastností, využili jsme standardní třídy MFC a na nich založili všechny objekty kostry programu.
Otevřete si soubor TestCOM.h. Projdeme se jím od konce k začátku. Poslední třídou, kterou objevíte, je CAplikace. Je odvozená od třídy CWinApp knihovny MFC. Představuje standardní Windows aplikaci a jsou v ní skryty nezbytné informace a akce pro běh programu (např. poskytuje cyklus zpráv, který vyhledává zprávy a odesílá je do okna aplikace). V naší odvozené třídě je přidána jedna členská proměnná m_pStranky - ukazatel na rámec pracující s jednotlivými stránkami. Pro vytvoření rámce stránek a jeho zrušení jsou připraveny členské funkce InitInstance a ExitInstance.
Třída pro rámec stránek je umístěna hned nad třídou aplikace. Opět je odvozena ze standardní třídy knihovny MFC CPropertySheet. Protože budeme používat 4 stránky vlastností, jsou v námi odvozené třídě doplněny 4 členské proměnné - pro každou stránku jedna. Každá stránka bude jiná, proto jsou odvozeny z různých tříd. Jejich jména jsem vtipně zvolil mPrvnimCtvrty. V konstruktoru rámce stránek jsou pak jednotlivé stránky přidány funkcí AddPage do našeho rámce stránek. Velikost vytvořeného rámce na displeji je automaticky taková, aby obsáhla největší stránku - dialog (alespoň tak praví teorie :-).
Jak bylo uvedeno, každá stránka našeho programu je jiná. Proto jsou nad rámcem stránek připraveny 4 různé třídy. Každá z nich je opět založena na standardní třídě MFC pro stránku dialogu CPropertyPage. Tři z nich jsou téměř prázdné. V konstruktoru námi odvozené třídy se jenom předá IDD příslušného resource do základní třídy CPropertyPage. Jelikož na první stránce chceme využít ukončovací tlačítko, je první třída rozšířená. Je v ní doplněno makro pro deklaraci mapy zpráv (zajišťuje vazbu mezi přijatou zprávou a příslušnou funkcí) a připravena funkce pro ukončení programu - OnKonec.
Druhý soubor, který jsme vytvořili, obsahuje vlastní zdrojový kód programu. Podíváme-li se na jeho obsah, zjistíme, že kromě popisu metod (členských funkcí) pro třídy CAplikace a CPrvni v něm skoro nic není.
Kde je tedy nějaký program?!
Celý náš program se skrývá na pátém řádku souboru TestCOM.cpp. Po 4 řádcích vkládajících hlavičkové soubory je uvedeno:
CAplikace mojeAplikace;
Ano, globální objekt mojeAplikace vytvořený pomocí třídy CAplikace je náš program. V jeho rámci jsou vytvářeny všechny prvky a probíhá komunikace s uživatelem.
Jak se to stane, je vidět hned pod tím. Dvě metody třídy CAplikace zajistí vytvoření a pak zrušení uživatelského rozhraní. V členské funkci InitInstance je nejprve vytvořen nový rámec stránek třídy CRamecStranek. Protože u některých verzí se nezobrazil automaticky titulek okna (i když by měl), použil jsem členskou funkci SetTitle připravenou MFC. Rámec stránek si ve svém konstruktoru sám vloží potřebné 4 stránky (viz TestCOM.h).
Samotný rámec se ještě nezobrazí. Použijeme tedy opět jeho členskou funkci DoModal, která zajistí zobrazení okna rámce i s jednotlivými stránkami. V členské funkci ExitInstance pak po sobě uklidíme zrušením objektu rámce stránek odkazovaném ukazatelem m_pStranky.
V popisu třídy CPrvni je na úvod zapsán podivná část:
BEGIN_MESSAGE_MAP(CPrvni,CPropertyPage)
ON_BN_CLICKED(IDC_KONEC,OnKonec)
END_MESSAGE_MAP()
Jedná se o mapu zpráv. Úsek mapy zpráv je ohraničen makry BEGIN_MESSAGE_MAP() a END_MESSAGE_MAP(). Mezi ně se pak vkládají jednotlivé zprávy ve formátu:
   JAKÁ_ZPRÁVA(ID_Prvku_který_ji_posílá, Jméno_funkce_která_se_provede).
V tomto případě je při kliknutí na prvek s IDC_KONEC vyvolána členská funkce OnKonec. Ta je ostatně popsána hned vzápětí. Přes členskou proměnnou m_pMainWnd v objektu mojeAplikace je vyvolána funkce DestroyWindow, která aplikaci ukončí.
Na závěr by bylo ještě vhodné zopakovat - knihovna MFC je poměrně rozsáhlá. Zde jsme využili pouze 3 ze tříd, které nabízí. Ve skutečnosti se v našem programu můžeme setkat s více třídami, než je na první pohled zřejmé. Použité třídy v rámci MFC přebírají díky dědičnosti vlastnosti jednodušších tříd, ze kterých jsou odvozeny. Tak např. CPropertySheet vznikla na základě řady tříd CObject -> CCmdTarget -> CWnd -> CPropertySheet.

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

  • Aplikace je obvykle skryta v objektu založeném na třídě CWinApp.
  • Zprávy s funkcemi jsou propojeny pomocí mapy zpráv.
 

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.