2.06. Przegląd programowania w MFC.txt

(27 KB) Pobierz
Rozdzia� 6.
Przegl�d programowania w MFC


W tym rozdziale:

Zapoznanie si� z og�ln� koncepcj� biblioteki MFC
Cele spe�niane przez bibliotek� MFC
Najcz�ciej wykorzystywane klasy MFC
Hierarchia obiekt�w MFC
Kiedy nie nale�y u�ywa� MFC


Ten rozdzia� r�ni si� od innych w ksi��ce tym, �e nie zawiera �adnego programu demonstracyjnego i bardzo niewiele przyk�ad�w kodu. Nie oznacza to, �e powiniene� go pomin�� i przej�� do bardziej �tre�ciwych" rozdzia��w. Tematy w nim zawarte stanowi� klucz do zrozumienia klas MFC (Microsoft Foundation Classes) i efektywnego ich wykorzystania przy tworzeniu 32-bitowych program�w dla Windows.
Powstanie MFC mo�e by� uwa�ane za jedno z najwi�kszych wydarze� zwi�zanych z programowaniem dla Windows. Zanim powsta�o MFC, programi�ci aplikacji byli skazani wy��cznie na korzystanie z Windows API. Je�li zajmowa�e� si� tworzeniem program�w korzystaj�cych jedynie z API, z pewno�ci� rozumiesz, jak ogromnego zadania si� podj�to. Wyobra� sobie tworzenie instrukcji case rozci�gaj�cej si� na wiele stron kodu lub r�czne tworzenie okna. W tamtych czasach programowanie Windows w C/C++ by�o uwa�ane bardziej za czarn� magi� w jeszcze wi�kszym stopniu ni� obecnie. Od tamtych czas�w powsta�y dwie konkurencyjne biblioteki klas: MFC oraz OWL (Object Window Library) Borlanda. Cho� oba produkty maj� swoje mocne i s�abe strony, jednak to MFC sta�o si� dominuj�c� bibliotek� dla tworzenia aplikacji dla Windows.
W tym rozdziale poznasz struktur� MFC oraz kryj�c� si� za ni� filozofi�, maj�c� wp�yw na ca�� architektur� tej biblioteki. Om�wimy tak�e pokr�tce hierarchi� obiekt�w, na koniec za� powiemy par� s��w o tym, kiedy nale�y wykorzysta� MFC, a kiedy lepiej jest pozosta� przy go�ym interfejsie Windows API.
Co to jest MFC?
MFC to skr�t nazwy kolekcji klas C++ stworzonych przez Microsoft i nazwanych Microsoft Foundation Classes. MFC dostarcza obiektowo zorientowanego szkieletu, kt�ry mo�e zosta� wykorzystany przez tw�rc�w program�w do tworzenia aplikacji Windows. MFC jest zorganizowane jako hierarchia klas C++. Kilka klas wysokiego poziomu zapewnia og�ln� funkcjonalno��, podczas gdy klasy ni�szych poziom�w implementuj� bardziej specyficzne zachowanie. Ka�da z klas niskiego poziomu jest wyprowadzona z klasy wysokiego poziomu, tak wi�c dziedziczy jej dzia�anie.
Na przyk�ad, klasa cwnd jest klas� wysokiego poziomu implementuj�c� wi�kszo�� funkcji wsp�lnych dla wszystkich okien. Ta klasa posiada mi�dzy innymi funkcje dla drukowania tekstu, rysowania grafiki oraz �ledzenia ruch�w wska�nika myszy. Klasa csplitterWnd jest wyprowadzona z klasy cwnd i dziedziczy wszystkie funkcje tej klasy. Klasa csplitterWnd implementuje specjalny rodzaj okna, nazywanego oknem dzielonym (ang. splitter window). Okno dzielone to okno podzielone co najmniej na dwie sekcje. Granica pomi�dzy sekcjami mo�e by� przesuwana przez u�ytkownika. Tego typu okna s� u�ywane mi�dzy innymi w Eksploratorze Windows przy wy�wietlaniu informacji na temat zawarto�ci dysku. Klasa csplitterWnd jest niskopoziomow� klas� wyprowadzon� z klasy wysokiego poziomu, cwnd.
MFC dostarcza tak�e innych korzy�ci. Obs�uguje wiele powszechnych zada� zwi�zanych z Windows, takich jak obs�uga i przekazywanie komunikat�w w tle. Zamiast pisa� t� sam� p�tl� obs�ugi komunikat�w w ka�dej tworzonej przez siebie aplikacji Windows, mo�esz skorzysta� z MFC, kt�re zrobi to za Ciebie, udost�pniaj�c Ci �atwe do zrozumienia i wykorzystania funkcje sk�adowe. Jedn� z takich funkcji jest OnPaint(), umo�liwiaj�ca wstawienie kodu wykonywanego w reakcji na otrzymanie komunikatu odmalowania okna.
Opr�cz hierarchii klas MFC dostarcza tak�e modelu tworzenia aplikacji. Ten model nosi nazw� modelu dokument-widok i stanowi metod� takiego projektowania aplikacji, �e dane aplikacji s� oddzielone od element�w interfejsu u�ytkownika. Dzi�ki temu obie cz�ci aplikacji mog� dzia�a� niezale�nie, umo�liwiaj�c programi�cie dokonywanie zmian w jednej cz�ci bez konieczno�ci drastycznej przebudowy drugiej.
Pot�ga MFC
Trudno w kilku s�owach opisa� si�� i elastyczno�� modelu typu dokument-widok. Ten model mo�e by� u�ywany w du�ej cz�ci tworzonych aplikacji.
Na przyk�ad, we� pod uwag� procesor tekst�w lub aplikacj� arkusza kalkulacyjnego. Dane zawarte w aplikacji s� w�a�nie dokumentem w modelu dokument-widok. Spos�b prezentacji tych danych nale�y wy��cznie do widoku. Klasa dokumentu posiada funkcje sk�adowe umo�liwiaj�ce klasie widoku dost�p do danych aplikacji. Dop�ki te funkcje nie ulegn� zmianie, nie ma potrzeby zmiany interfejsu u�ytkownika. W rzeczywisto�ci, dokument nie musi by� nawet dokumentem procesora tekst�w czy arkusza kalkulacyjnego. Mog� nim by� r�wnie dobrze rekordy bazy danych lub obrazki w programie graficznym. Dop�ki funkcje sk�adowe nie ulegn� zmianie, nie ma znaczenia rodzaj u�ywanych informacji. Szczeg�y architektury typu dokument-widok zostan� przedstawione w rozdziale 19.
Filozofia MFC
Struktura programowania aplikacji, taka jak MFC, stanowi kolekcj� bibliotek udost�pniaj�cych programi�cie zestaw us�ug pomocnych przy tworzeniu aplikacji. Zwykle taka struktura jest zaprojektowana w taki spos�b, aby jak najbardziej usprawni� proces tworzenia, a tak�e upro�ci� trudne lub �mudne zadania programistyczne. W szczeg�lno�ci, MFC zosta�o zaprojektowane do uproszczenia korzystania z du�ych cz�ci Windows API. MFC przej�o wi�kszo�� z funkcji API, takich jak zarz�dzanie oknami, wyj�cie graficzne czy przekazywanie komunikat�w, ujmuj�c je w bardziej przyjazne dla programisty klasy C++, du�o �atwiejsze w u�yciu. W wielu przypadkach MFC wykonuje pewne z�o�one operacje w tle, dzi�ki czemu programista ma do czynienia z du�o prostszym interfejsem i nie musi si� boryka� z niekt�rymi niewdzi�cznymi aspektami programowania z u�yciem Windows API.
Jednym z celu zespo�u tworz�cego MFC by�o dostarczenie u�ytecznego szkieletu przy zachowaniu jak najmniejszego narzutu. MFC nie mia�oby wi�kszego zastosowania, je�li w zwi�zku z jego wykorzystaniem aplikacje dzia�a�yby du�o mniej wydajnie. Projektanci MFC spr�bowali zredukowa� narzut wnoszony przez bibliotek� w takim stopniu, jak to tylko by�o mo�liwe. Ich wysi�ki doprowadzi�y do powstania �wietnej architektury, w bardzo niewielkim stopniu zmniejszaj�cej wydajno�� aplikacji przy jednoczesnym zdj�ciu z bark�w biednego programisty ogromnego ci�aru zwi�zanego z bezpo�rednim programowaniem interfejsu Windows API.
Stabilno�� projektu szkieletu mo�na pozna� po mo�liwo�ciach rozszerzania biblioteki. Ka�dy szkielet programowy wart swej ceny powinien mie� mo�liwo�� �atwej rozbudowy. Wiele ze szkielet�w C++ opiera si� w tym celu na mechanizmach obiektowych samego j�zyka, jednak samo wykorzystanie mo�liwo�ci j�zyka to nie wszystko. Aby szkielet m�g� by� naprawd� rozbudowywany, jego wewn�trzne struktury tak�e musz� by� dobrze skonstruowane i sp�jne.
MFC zosta�o stworzone z wielu klas C++. Niekt�re, takie jak Cwnd czy CwinThread, stanowi� podstaw� dla du�ej cz�ci ca�ego szkieletu. Te podstawowe klasy zawieraj� podstawowe funkcje, takie jak otwarcie okna, wymagane przez wi�kszo�� aplikacji Windows. Inne, bardziej wyspecjalizowane klasy, takie jak CSplitterWnd, s� wyprowadzone w�a�nie z klas podstawowych. Klasy pochodne dziedzicz� wszystkie w�a�ciwo�ci klas nadrz�dnych, uzupe�niaj�c je o w�asne, specyficzne dla siebie mo�liwo�ci. Jako programista Windows mo�esz skorzysta� z mo�liwo�ci rozbudowy hierarchii klas MFC, tworz�c w�asne klasy, wykonuj�ce specjalistyczne zadania. Hierarchii klas MFC przyjrzymy si� za chwil�, w sekcji zatytu�owanej �Hierarchia klas MFC".
Zalety p�yn�ce z wykorzystania MFC
Obiektowo zorientowana struktura MFC grupuje powi�zane ze sob� obszary Windows API w poszczeg�lne klasy i obiekty. Na przyk�ad, klasa cwnd kryje w sobie wi�kszo�� funkcji API zwi�zanych z obs�ug� okien. Jako programista aplikacji nie musisz ju� pami�ta� mn�stwa wywo�a� API. Wszystko co musisz zrobi� to stworzy� nowy egzemplarz obiektu klasy cwnd i wywo�a� kilka jego funkcji sk�adowych. Listingi 6.1 oraz 6.2 ilustruj� r�nic� przy tworzeniu okna za pomoc� MFC oraz bez MFC.
Listing 6.1. Tworzenie okna bez u�ycia MFC
int WINAPI WinMain (HINSTANCE hlnstance,
HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
static char szAppName[] = "NonMFC" ; HWND       hwnd ; MSG        msg ; WNDCLASSEK wndclass ;
//	Wype�nienie struktury wndclass wymaganymi informacjami.
//	Te ustawienia tworz� proste okno bez menu,
//	pask�w przewijania oraz paska stanu.
wndclass.cbSize       = sizeof(wndclass) ;
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
wndclass.IpfnWndProc  = WndProc ;
wndclass.cbClsExtra   = O ;
wndclass.cbWndExtra   = O ;
wndclass.hlnstance    = hlnstance ;
wndclass.hlcon        = Loadlcon(NULL, IDI_APPLICATION) ;
wndclass.hCursor      = LoadCursor(NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH)
wndclass.1pszMenuName  = NULL ;
wndclass.1pszClassName = szAppName ;
wndclass.hlconSm      = Loadlcon(NULL, IDI APPLICATION) ;
RegisterClassEx (Swndclass) ,//	nazwa klasy okna
 
hwnd = CreateWindow (szAppName,//	nag��wek okna
"Non-MFC App",//	styl okna
WS_OVERLAPPEDWINDOW,//	pocz. p�z. na osi x
CW_USEDEFAULT,//	pocz. p�z. na osi y
CW_USEDEFAULT,//	pocz. szeroko�� okna
CW_USEDEFAULT,//	pocz. wysoko�� okna
CW_USEDEFAULT,//	uchwyt okna nadrz�dnego
NULL,//	uchwyt menu okna
NULL,//	uchwyt egzemplarza
hlnstance,//	programu

NULL) ;//	parametry inicjacji okna

// W tym momencie klasa okna zosta�a zarejestrowana w systemie // operacyjnym. Stworzono tak�e egzemplarz klasy okna, kt�ry // jednak jeszcze nie jest widoczny na ekranie.
// Poka�my okno i zaktualizujmy je ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ;
Programowanie z u�yciem �go�ego" API wymaga pracy z kilkoma r�nymi strukturami danych oraz z czterema r�nymi wywo�aniami funkcji. W wi�kszych projektach brak obiektowego zorientowania API stwarza trudno�ci przy zarz�dzaniu kodem. Por�wnaj listing 6.1 z listingiem 6.2.
i
Listing 6.2. Tworzenie ...
Zgłoś jeśli naruszono regulamin