Miután van már működő programunk , igaz nem valami fenomenális, megnézhetnénk, hogy tulajdonképpen miért is működik. Mivel a programunk MFC-vel készült (Nem tudom miért éppen azzal, de ha már elkezdtem... ), tisztázni kéne, hogy mi is az.
 

Az MFC a Microsoft Foundation Classes rövidítése. Nem más, mint egy objektumrendszer, ami a windows-os programozást hívatott megkönnyíteni. Eltakarja előlünk a valódi API-t (Application Program Interface) és használja helyettünk. Ezen kívül a dokumentunkezelésekre, OLE-re, DAO-ra, és még sokmindenre vannak saját cuccai. Ennek fejében nekünk az ő szabályai szerint kell játszanunk. Mit jelent ez? Meg vannak előre adva az objektumok típusai. Pl.: a dilalógusablak, a szerkesztőablak, gombok stb...
Ezek tulajdonképpen megadják a programunk 'csontvázát'. A mi dolgunk 'csak' annyi, hogy hozzáírjuk azt a részt, amit csak mi tudunk, hogy minek kell lennie, ami már nem általánosítható, a program specifikus jegyei. Ennyi elég is lesz az elméletből, nézzük a gyakorlatot.

Csináljunk egy programot.

Ugyanúgy, mint az előző számban, MFC Appwizard, Dialog Based, stb stb...

Azzal a kis különbséggel, hogy most ne kérjünk About Box-ot. Így egyszerűbben át fogjuk látni a dolgot.

Na eddig jutottunk az előző számban is. A program ugyan már most is működik, de nekünk nem sok közünk van hozzá.

Nézzük milyen forrás -és fejlécállományok vannak, anélkül, hogy belefolynánk a részletekbe:

 

Ezeket alapvetően 2 részre oszthatjuk.

Van, amibe nem nagyon kell belenyúlni:

second.rc : ebben van eltárolva az összes ablak minden adata, miden bitmap, az iconfile neve stb..

resource.h : itt van konkrét érték adva a különböző ID-knek.

stdafx.h : az MFC cuccokat include-olja be

stdafx.cpp : MFC-t include-ol

Amibe bele lehet, és ha programozunk, bele is kell nyúlni:

Second.h Ebben van definiálva az application objektum típusa. A CWinApp-ból van származtatva
 

seconddlg.h Ebben van definiálva maga a kezdő dialógusablak. A CDialog class-ból van származtatva. Fontos, hogy itt van megadva az IDD-je. Ez annyit tesz, hogy a resources-nél ezen cím alatt lehet szerkeszteni az ablakot.
enum { IDD = IDD_SECOND_DIALOG };

Tehát, a ResourceView-nél az IDD_SECOND_DIALOG-ra ráclickelve a kezdő dialógusablak szerkeszthető.

*. cpp File-okban a hozzájuk tartozó header-ekben definiált függvények megvalósítása található.
 

Na, azt hiszem sikerült elég felületes lenni ahoz, hogy még kérdések se tudjanak felmerülni. Nehogymár ne lássuk a fától az erdőt, akkor inkább már a fát se!
 

Csináljunk már valami újat is. Mondjuk egy új dialógusablakot. Két dolgot kell csinálnunk.
 

1. Először a Resource View-nál be kell insertelni egy új dialog-ot. A jobb egérgombra előjön, hogy asszongya:
 

 

Erre aztán nem is kérdez semmit, ott fog teremni egy újabb dialógusablak szerkesztőstül. Miután az ablakot mindenki kénye kedve szerint összeszerkesztette, felmerül a kérdés, hogy legyen más a neve. A ResourceView nál jobb gombbal rákatt, és properties. Itt más ID-t is beírhatunk.

Ez után jön a második lépés.

2. Az új ablakhoz létre kell hozni egy új Class-t is. Főmenü Insert/New Class.

Ami nagyon fontos, hogy a Dialog ID-hez az imént szerkesztett Dialog ID-jét írjuk be. A base class pedig legyen CDialog. A filename lehet bármi, a class type legyen MFC.
 

Megvan a class, saját kis header, meg cpp file-al. Megvan maga a dialog. már csak azt kéne elérni, hogy a program futása során előjöjjön.
 

Kicsit bele kell nyúlni a másik dialógusablakba is.
 

Nézzünk ki egy szimpatikus gombot rajta, és nyomjunk rá egy jobb clicket, és válasszuk az Events... menüpontot. (nálam ez egy kilép nevű gomb volt)

Szóval a bal oldalon azok közül az események közül lehet választani, amik bekövetkezhetnek. Ez egy gombnál nem túl bonyolult, lehet egy click, meg kettő. A jobboldalon felül a már létező handler-ek vannak. A jobb oldalon alul pedig azt kell kiválasztani, mivel akarjuk lekezelni. Az Add Handler csak Hozzáad egy handlert, az Add and edit -nál pedig rögtön szerkeszthetjük is.

Ezek az Event Handlerek nagyon fontosak, ugyanis ez az egyik ritka módja annak, hogy az általunk írt programrészekre tudjuk adni a vezérlést, az idő többi részében a WIN32s vagy az MFC végzi a dolgokat.

Akkor Add and Edit.

Rákérdez a létrehozandó függvény nevére, majd rögtön megjelenik a szerkesztőablakban.

Most jön azon ritka pillanatok egyike, hogy beleírhatunk a programunka. Kezdjük azzal, hogy az include-ok közé beírjuk a meghívandó dialógusablak header-jét. Ugyanis itt van definiálva a típusa.

pl.: #include "newdlg.h"

A handler pedig csak ennyi lesz:

void CSecondDlg::OnKilep() {   newdlg dlg; //dlg egy newdlg típusú változó   dlg.DoModal(); //meghívjuk azt a függvényét, ami elindítja. }

Tehát mivel a class-ok csak típusok, nem adhatjuk rájuk a vezérlést (nem hívhatjuk függvényeiket). Kell csinálni egy változót abból a típusból. És a változó DoModal() függvényével tudjuk odaadni a vezérlést.
 

És már be is iktattunk egy újabb ablakot. Nem olyan bonyolult.