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 ...
Morfeusz__