[ Pobierz całość w formacie PDF ]
.Rzeczywist¹ pracê wykonuje jedynie funkcja GetNextDocTemplate () - pobiera ona wskaŸnik typu POSITION do nastêpnego wzorca dokumentu.Jak widaæ, w drugim fragmencie kodu wystêpuje rzutowanie wskaŸnika, gdy¿ funkcja GetNextDoc () zwraca wskaŸnik do klasy bazowej CDocument.W tym miejscu w³aœciw¹ praktyk¹ by³oby zastosowanie funkcji isKindOf o lub u¿ycie makra MFC DYNAMIC_DOWNCAST () w celu upewnienia siê, ¿e otrzymujemy naprawdê to, czego chcemy, lecz w tych przyk³adach zrezygnowaliœmy z tego na rzecz prostoty.Niszczenie wzorcówdodanych funkcj¹ sk³adow¹ AddDocTemplate()Jeœli przy dodawaniu wzorców dokumentów do listy u¿y³eœ funkcji MFC AddDocTem-plate (), w momencie zamykania aplikacji nie musisz martwiæ siê o usuwanie wzorca.Jednak w pewnych przypadkach mo¿esz za¿yczyæ sobie ukrycia wzorca przed u¿ytkownikiem, wiêc musisz mieæ jakiœ sposób usuniêcia wzorca.Mo¿liwoœæ usuniêcia obiektu wzorca jeszcze w trakcie normalnej pracy programu jest zbyt po¿yteczna, aby z niej zrezygnowaæ.Podczas projektowania aplikacji nie martw siê przechowywaniem wzorców tak d³ugo, jak d³ugo s¹ potrzebne - to naprawdê bardzo niewielkie objêtoœciowo dane.Jednak tak jak w przypadku ka¿dego innego obiektu mo¿na trzymaæ siê pewnych zasad.Tysi¹c wzorców by³oby ju¿ prawdopodobnie pewnym obci¹¿eniem pamiêci (i koszmarem przy kodowaniu), jednak dziesiêæ czy dwadzieœcia wzorców nie stanowi ¿adnego problemu, oczywiœcie pod warunkiem, ¿e rzeczywiœcie ich potrzebujesz.Wykorzystanie klasy CViewJak ju¿ wiemy, dla ka¿dej klasy wyprowadzonej z coocument stosuje siê klasê wyprowadzon¹ z cview stanowi¹c¹ interfejs wizualny.Klasa wyprowadzona z cview stanowi wizualn¹ prezentacjê danych dokumentu oraz odpowiada za interakcjê u¿ytkownika z oknem widoku.Z kolei okno widoku jest oknem potomnym okna ramki.W aplikacji SDI okno widoku jest oknem potomnym g³Ã³wnego okna ramki.W aplikacji MDI okno widoku jest oknem potomnym potomnego okna MDI.Oprócz tego, okno ramki mo¿e byæ oknem ramki podczas edycji „na miejscu" OLE, jeœli tylko Twoja aplikacja obs³uguje tak¹ edycjê.Z kolei okno ramki mo¿e zawieraæ kilka okien widoków (na przyk³ad w postaci okna dzielonego, o którym dowiesz siê w rozdziale 20.).Deklarowanie klasy widokuJak szczegó³owo wyjaœnialiœmy w poprzednich sekcjach, wszelkie dane stanowi¹ce czêœæ dokumentu powinieneœ zadeklarowaæ jako zmienne sk³adowe klasy dokumentu.Jednak wci¹¿ maj¹c to na uwadze, powinieneœ zdawaæ sobie sprawê tak¿e z tego, ¿e wiele elementów danych w aplikacji bêdzie odnosiæ siê równie¿ do danego widoku.Co wiêcej, wiêkszoœæ z tych danych bêdzie ulotna - co znaczy, ¿e nie trzeba zapisywaæ ich wraz z dokumentem.Przypuœæmy na przyk³ad, ¿e tworzysz aplikacjê zdoln¹ do prezentacji danych dokumentu przy ró¿nych wspó³czynnikach powiêkszenia.Wspó³czynnik powiêkszenia jest specyficzny dla poszczególnego widoku - co oznacza, ¿e w ró¿nych widokach mog¹ wyst¹piæ ró¿ne powiêkszenia, nawet jeœli te widoki odnosz¹ siê do tego samego dokumentu.Bior¹c to pod uwagê, prawdopodobniej najlepiej obs³u¿ysz wspó³czynnik powiêkszenia, deklaruj¹c go jako zmienn¹ sk³adow¹ klasy widoku, a nie jako zmienn¹ sk³adow¹ klasy dokumentu:class CZoomView : public CView{protected:CZoomView();DECLARE_DYNCREATE(CZoomView) public:CZoomableDoc* GetDocument();WORD m wZoomPercent;}Jednak du¿o wa¿niejsza ni¿ jakakolwiek zmienna sk³adowa reprezentuj¹ca jakieœ ustawienie jest zmienna sk³adowa reprezentuj¹ca bie¿¹ce zaznaczenie.Bie¿¹ce zaznaczenie jest kolekcj¹ obiektów wewn¹trz dokumentu zaznaczonych przez u¿ytkownika w celu dokonania na nich manipulacji.Natura ³ rodzaj wykonywanej przez u¿ytkownika manipulacji jest ca³kowicie zale¿na od aplikacji, mo¿e jednak obejmowaæ takie operacje jak wycinanie i kopiowanie do schowka lub operacje „przeci¹gnij i upuœæ" OLE.Najprostszym sposobem zaimplementowania bie¿¹cego zaznaczenia jest u¿ycie klasy kolekcji, tak jak w przypadku klasy dokumentu.Na przyk³ad, kolekcjê reprezentuj¹c¹ bie¿¹ce zaznaczenie mo¿esz zadeklarowaæ nastêpuj¹co:class CSelectableView : public CView{// tutaj wiêcej koduCList m SelectList;}Oprócz zmodyfikowania deklaracji klasy widoku musisz napisaæ jedn¹ lub kilka funkcji sk³adowych, tak aby klasa widoku mog³a odpowiadaæ na operacje zaznaczania - wype³nianie i opró¿nianie listy itd.Jednak w ka¿dym przypadku musisz przes³oniæ funkcjê sk³adow¹ OnDraw ()
[ Pobierz całość w formacie PDF ]