Rozdzia� 20. Uk�ad aplikacji MDI W tym rozdziale: Ponowny przegl�d modelu dokument-widok Ponowny przegl�d klasy CDocument Zarz�dzanie z�o�onymi kombinacjami dokument�w, widok�w i ramek Program PaintObj Dynamicznie dzielone okna ��czenie widok�w z dokumentami Tworzenie statycznych okien dzielonych Program Dynasplit Subclassing okien potomnych W rozdziale 19. pozna�e� stosowany w MFC model dokument-widok. Nast�pnie u�y�e� go do zbudowania prostej jednodokumentowej (SDI) aplikacji. Cho� tworzenie aplikacji SDI jest oczywi�cie przydatnym �wiczeniem, jednak interfejs jednodokumentowy nadaje si� g��wnie dla niewielkich i prostych aplikacji. W przypadku wi�kszo�ci rzeczywistych aplikacji konieczna staje si� mo�liwo�� korzystania z wielu widok�w oraz wielu dokument�w, dzi�ki kt�rym mo�na lepiej zorganizowa� informacj�. Gdy w pojedynczej aplikacji mo�esz otworzy� kilka dokument�w, oznacza to, �e w modelu dokument-widok stosujesz struktur� interfejsu wielodokumentowego (MDI). Uk�ad aplikacji MDI jest nieco bardziej z�o�ony ni� uk�ad aplikacji SDI. Podstawow� struktur� takiej wielodo-kumentowej aplikacji przedstawia rysunek 20.1. Jak wida� na rysunku, aplikacje MDI wci�� korzystaj� z g��wnej ramki zawieraj�cej menu, pasek narz�dzi oraz pasek stanu. Jednak w aplikacji MDI klasa CMainFrame jest wyprowadzona Z klasy CMDIFrameWnd, a nie Z klasy CFrameWnd. Okno klasy CMDIFrameWnd wygl�da tak samo jak okno klasy CFrameWnd, ale opr�cz tego obs�uguje protok� MDI oczekiwany przez Windows od aplikacji tego typu. Okna potomne wyst�puj�ce na rysunku s� tak�e oknami ramek, lecz w tym przypadku s� tak�e egzemplarzami klasy MFC CMDichildWnd. Ta klasa zapewnia okna potomne, kt�rych aplikacja MDI w Windows u�ywa w swoim obszarze roboczym do przechowywania poszczeg�lnych egzemplarzy widok�w. MFC tworzy po jednym obiekcie CMDichildWnd dla ka�dego z widok�w, podobnie jak obiekt CMainFrame jest tworzony dla pojedynczego widoku w aplikacji SDI. Widok zawarty w ramce mo�e by� dowolnego typu i mo�e odnosi� si� do dowolnego z dokument�w aktualnie otwartych w aplikacji. Jako tw�rca aplikacji MFC sam odpowiadasz za podj�cie decyzji, jakie rodzaje dokument�w i widok�w zaimplementujesz i w jaki spos�b b�d� one wsp�dzia�a� z podstawowym szkieletem aplikacji MDI lub SDI utworzonym przez MFC. Tw�j kod zmienia i rozszerza spos�b, w jaki og�lne dokumenty i widoki wsp�dzia�aj� ze sob�. Dostosowuj�c to wsp�dzia�anie do w�asnych potrzeb, zamieniasz szkielet dostarczony przez MFC w aplikacj� wykonuj�c� dok�adnie to, o co Ci chodzi. W trakcie czytania tego rozdzia�u dowiesz si� du�o wi�cej na temat komponent�w aplikacji MDI, a tak�e spr�bujesz stworzy� tak� aplikacj�, aby jeszcze lepiej m�c wybra� struktur� wymagan� dla swojej aplikacji. Ponowny przegl�d modelu dokument-widok Jak wiesz z rozdzia�u 19., aplikacje MFC domy�lnie wykorzystuj� model programowy oddzielaj�cy dane programu od wy�wietlaj�cego je kodu oraz od kodu przyjmuj�cego polecenia u�ytkownika. (Z takiego modelu rezygnujesz wtedy, gdy nakazujesz AppWizardowi utworzenie aplikacji opartej na oknie dialogowym lub gdy stworzysz niestandardowy projekt, na przyk�ad taki jak serwer automatyzacji ActiveX). W modelu dokument-widok obiekt dokumentu MFC odczytuje i zapisuje dane z i do miejsca ich sk�adowania. Dokument mo�e tak�e dostarczy� interfejsu do danych wyst�puj�cych w jakim� miejscu (na przyk�ad w bazie danych). Oddzielny obiekt widoku zajmuje si� wy�wietlaniem danych - od rysowania reprezentacji danych w oknie a� po zaznaczenie i edycj� danych przez u�ytkownika. Widok pobiera dane przeznaczone do wy�wietlenia od obiektu dokumentu i informuje zwrotnie dokument o konieczno�ci zmiany danych. Cho� mo�esz �atwo przes�oni� lub zignorowa� ten podzia� pomi�dzy dokumentem a widokiem, istnieje wiele przyczyn, dla kt�rych zwykle nie powiniene� tego robi�. Najlepszym przyk�adem mo�e by� konieczno�� posiadania kilku widok�w tego samego dokumentu, na przyk�ad arkusza kalkulacyjnego i wykresu. W modelu dokument-widok ka�dy z obiekt�w widok�w reprezentuje osobny widok danych, podczas gdy kod wsp�lny dla wszystkich widok�w (na przyk�ad procedury obliczeniowe) mo�e wyst�powa� w obiekcie dokumentu. Dokument tak�e bierze na siebie zadanie aktualizowania wszystkich widok�w w momencie zmiany danych. Architektura dokument-widok w MFC bardzo u�atwia projektowanie aplikacji obs�uguj�cych wiele widok�w, wiele typ�w dokument�w, dzielone okna i inne wizualne elementy interfejsu u�ytkownika. Wiesz ju�, jak w swojej aplikacji zaimplementowa� wiele widok�w; w tym rozdziale dowiesz si� tak�e, jak w swojej aplikacji obs�u�y� kilka rodzaj�w dokument�w oraz dzielone okna. W sercu architektury dokument-widok le�� cztery kluczowe klasy, z kt�rych ka�d� pozna�e� ju� w rozdziale 19., i kt�re tutaj tylko pokr�tce przypomnimy: CDocument (lub bardziej wydajna, wyprowadzona z niej klasa coleDocument), obiekt u�ywany w aplikacji do przechowywania lub zarz�dzania danymi aplikacji, zapewniaj�cy tak�e dane dla widok�w powi�zanych z t� klas� dokumentu CView (lub jedna z wielu wyprowadzonych z niej klas, takich jak cscroliview, CEditview itd.), obiekt u�ywany w aplikacji do wy�wietlania jej danych oraz do obs�ugi wsp�pracy u�ytkownika z danymi - zar�wno przegl�dania danych, jak te� ich zaznaczania i modyfikowania. CFrameWnd (lub jedna z jej odmian, takich jak CMDichildWnd), obiekt zapewniaj�cy okno ramki dooko�a jednego lub kilku widok�w dokumentu. W aplikacji MDI program posiada co najmniej dwa okna ramek - jedno zawieraj�ce ca�� aplikacj� (i w zwi�zku z tym nie posiadaj�ce powi�zanej ze sob� klasy dokumentu) oraz jedno lub wi�cej okien wy�wietlaj�cych dane aplikacji przechowywane w jednej lub kilku klasach dokument�w. CDocTemplate (lub jedna z wyprowadzonych z niej klas, takich jak csingleDoc-Template czy CMultiDocTempiate), obiekt koordynuj�cy jeden lub wi�cej dokument�w danego typu i zarz�dzaj�cy ukrytymi zadaniami, jakie MFC musi wykona� w celu stworzenia poprawnego dokumentu, widoku oraz okna ramki dla tego typu dokumentu. Ponowny przegl�d klasy CDocument Jak ju� wiesz, klasa CDocument zapewnia podstawowe funkcje dla zdefiniowanych przez u�ytkownika klas dokument�w. Dokument reprezentuje jednostk� danych zwykle otwieran� przez u�ytkownika za pomoc� polecenia Otw�rz w menu Plik i zapisywan� za pomoc� polecenia Zapisz w tym samym menu. Klasa CDocument obs�uguje standardowe operacje, takie jak tworzenie dokumentu, �adowanie do niego danych oraz zapisywanie na dysk danych zawartych w dokumencie. MFC manipuluje dokumentami poprzez interfejs zdefiniowany w klasie CDocument. Aplikacja mo�e obs�u�y� wi�cej ni� jeden rodzaj dokumentu. Na przyk�ad, aplikacja mo�e obs�ugiwa� zar�wno arkusze kalkulacyjne, jak i dokumenty tekstowe (cho� w wi�kszo�ci tworzonych dzisiaj aplikacji naturalnym dokumentem by�by dokument tekstowy, za� arkusz kalkulacyjny by�by obs�ugiwany poprzez osadzanie i ��czenie obiekt�w, czyli OLE). Ka�dy typ dokumentu posiada powi�zany ze sob� wzorzec dokumentu, tworzony w funkcji sk�adowej initinstance () obiektu aplikacji. Wzorzec dokumentu okre�la, jakie zasoby (na przyk�ad menu, dialog, ikon� lub tablic� akcelerator�w) wykorzystuje dany rodzaj dokumentu. Ka�dy dokument zawiera wska�nik do powi�zanego z nim obiektu CDocTemplate (wzorca dokumentu). W rozdziale 19. przy tworzeniu swojego programu SDI u�ywa�e� obiektu csingleDocTemplate wyprowadzonego z klasy CDocTemplate. Podczas tworzenia aplikacji MDI u�yjesz zamiast niego obiektu CMulti-DocTemplate. U�ytkownicy wsp�pracuj� z dokumentem poprzez powi�zane z nim obiekty cview. Widok tworzy w oknie ramki obraz danych zawartych w dokumencie, a tak�e interpretuje dzia�ania u�ytkownika odnosz�ce si� do zawarto�ci tego dokumentu. Z pojedynczym dokumentem mo�esz powi�za� kilka widok�w. Gdy u�ytkownik otwiera okno dla dokumentu, MFC tworzy widok i powi�zuje go z tym dokumentem. U�yty typ widoku oraz klas� okna ramki okre�la wzorzec dokumentu. Dokument otrzymuje polecenia kierowane do niego przez aktywny widok. Je�li dokument nie obs�u�y danego polecenia, przekazuje je do wzorca dokumentu zarz�dzaj�cego tym dokumentem (kt�ry z kolei mo�e przekaza� polecenie do okna ramki dokumentu, okna ramki aplikacji itd.). Gdy u�ytkownik modyfikuje dane dokumentu, ka�dy z powi�zanych z nim widok�w musi odzwierciedli� te modyfikacje. Klasa CDocument dostarcza funkcji sk�adowej UpdateAllviews (), kt�rej mo�esz u�y� do poinformowania widok�w o takich zmianach, dzi�ki czemu widoki b�d� mog�y automatycznie od�wie�y� swoj� zawarto��. Opr�cz tego, je�li dane dokumentu ulegn� zmianie, przed zamkni�ciem nie zapisanego dokumentu MFC samo poprosi u�ytkownika o potwierdzenie tej decyzji. W typowej aplikacji, w celu zaimplementowania dokument�w musisz wykona� nast�puj�ce operacje: Dla ka�dego rodzaju dokumentu, z jakiego b�dziesz korzysta� w aplikacji, wyprowad� jego klas� z klasy CDocument (lub COleDocument). Dodaj do klasy dokumentu zmienne sk�adowe, w kt�rych b�d� przechowywane dane dokumentu (albo jako proste zmienne w prostych aplikacjach, albo jako bardziej z�o�one struktury, takie jak obiekty ccmdTarget w z�o�onych aplikacjach, na przyk�ad w aplikacjach OLE). Zaimplementuj funkcje sk�adowe dla odczytu i modyfikacji danych dokumentu. Widoki powi�zane z dokumentem s� najwa�niejszymi u�ytkownikami tych funkcji. R�ne widoki dokumentu zaimplementujesz na podstawie sposob�w, na jakie u�ytkownik musi mie� dost�p do danych zawartych w dokumencie. Przes�o� funkcj� sk�adow� CDocument: :Serialize () w klasie dokumentu, aby m�c zapisywa� dane na dysk oraz odczytywa� je z pliku na dysku. Pami�taj, �e powiniene� odczytywa� informacje z pliku w tej samej kolejno�ci, w jakiej zosta�y one w nim zapisane. Klasa coieDocument, tak�e pochodz�ca od klasy CDocument, umo�liwia obs�ug� technologii �przeci�gnij i upu��" OLE, a tak�e operacje osadzania i ��czenia obiekt�w w oknie dokumentu. Zarz�dzanie bardziej z�o�onymi kombinacjami dokument�w...
Morfeusz__