[ Pobierz całość w formacie PDF ]
.Ich subskrypcja, co prawda, nie jest tania, jednak można tam znaleźć ogromne ilości dokumentacji oraz przykładowych programów, których kod możesz używać we własnych programach.Interesujący kod możesz także znaleźć w dostępnych na rynku pakietach narzędziowych.Zazwyczaj firmy produkujące te narzędzia udostępniają wsparcie dla programistów, jednak nie jest łatwo zdobyć kod źródłowy takich narzędzi.Najczęściej musisz także płacić za możliwość używania tych narzędzi we własnych, komercyjnych aplikacjach.Problem z kopiowaniem kodu źródłowego polega na tym, że jest on bardzo często niekompatybilny z MFC.Rozpatrzmy przykład aplikacji będącej prostą przeglądarką map bitowych.Po przeszukaniu CD ROM-u Developer's Network okazuje się, że dostępna jest tam biblioteka DLL służąca do obsługi takich plików.Biblioteka ta (DIBAPI.DLL) potrafi wykonywać wiele podstawowych operacji na plikach BMP, w tym także otwierać je, czytać i wyświetlać.Biblioteka ta jest fragmentem przykładu WINCAP.Przykład ten możesz także znaleźć w niektórych SDK-ach oraz w Internecie.Odpowiedni dokument ma symbol S14049 lub (w nowszych wersjach) Q97193.Dzięki temu, że dostępny jest kod źródłowy tej biblioteki, będziesz mógł w miarę prosto stworzyć nową jej wersję, wykorzystującą styl C++.Osobiście jednak wolę nie modyfikować cudzego kodu, który działa całkiem dobrze.Zamiast tego zdecydowałem się stworzyć nowy obiekt wykorzystujący funkcje dostępne w bibliotece DLL (CDib -patrz rozdział? oraz tabela 2.4).Nikt, kto używa klasy CDib, nie musi wiedzieć, że jej implementacja umieszczona jest w bibliotece DLL stworzonej w języku C.Moja oryginalna implementacja klasy CDib przeznaczona była do współpracy z MFC w wersji 16-bitowej.Podczas tworzenia nowej, 32-bitowej wersji klasy CDib, musiałem wprowadzić także pewne modyfikacje w kodzie źródłowym biblioteki DIBAPI (wszystkie pliki będziesz mógł znaleźć na CD ROM-ie dołączonym do książki.Tajniki klasy CDibDokładne omówienie tej klasy znajdziesz w rozdziale 7 tej książki.Na razie wystarczy, abyś wiedział, że klasa CDib reprezentuje pliki BMP, podobnie jak obiekty klasy CWnd reprezentują okna.Klasa CDib, podobnie jak wiele innych obiektów MFC, stosuje dwuetapowy proces tworzenia obiektów.Zadeklarowanie obiektu CDib nie kojarzy go z żadną mapą bitową.Aby zainicjalizować obiekt klasy CDib musisz wywołać metodę Create.Obiekty tej klasy mogą być tworzone na podstawie pliku, innego obiektu tej klasy, okna lub całego ekranu.Możesz stworzyć nowe obiekty klasy CDib na wiele różnych sposobów.Jednak najważniejsze jest to, że obiekty te rozróżniają rozszerzenia plików chociaż nie korzystają z pomocy obiektów klas CFile ani CArchive.Przykładowa aplikacjaAby pokazać możliwości wykorzystania klasy CDib, stworzyłem prostą aplikację -BMPYIEW - służącą do przeglądania plików BMP (patrz, rysunek 2.2 i listing 2.3).Aplikacja BMPYIEW stworzona została przez kreatora App Wizard.Jednak usunąłem z niej niektóre standardowe fragmenty kodu.Dla przykładu, BMPYIEW nic może modyfikować przeglądanych plików - dlatego w tym programie nie jest dostępna opcja Plik=>Zapisz (możesz jednak zapisać plik pod inną nazwą; opcja Plik=>Zapisz jako jest dostępna).Nie ma również żadnej potrzeby tworzenia nowego dokumentu podczas uruchamiania programu.Listing 2.3.Obiekt dokumentu stosowany w aplikacji BMPVIEW.// bmpvidoc.cpp : implementation of the CBmpViewDoc class//ttinclude "stdafx.h"ttinclude "bmpview.h"ttinclude "bmpvidoc.h"tłifdef _DEBUGtłundef THIS“FILEstatic char BASED_CODE THIS_FILE[] = _FILE_;łfendif///// // CBmpViewDocIMPLEMENT_DYNCREATE(CBmpViewDoc, CDocuraent)BEGIN_MESSAGE“MAP(CBmpViewDoc, CDocument) //{{AFX_MSG_MAP(CBmpViewDoc) //} }AFXJYISG_MAPEND_MESSAGE_MAP()11111111 / 11111111,II CBmpViewDoc construction/destructionCBmpViewDoc::CBmpViewDoc() {m_dib=NULL; }CBmpViewDoc::~CBmpViewDoc() { }BOOL CBmpViewDoc::OnNewDocument() {i f (!CDocument::OnNewDocument())return FALSE; return TRUE; }void CBmpViewDoc::DeleteContents(void){if (m_dib) delete m_dib;m_dib=NULL;}BOOL CBmpViewDoc::OnOpenDocument(const char * fn){DeleteContents();SetModifiedFlag(FALSE);m_dib=new CDib;return m_dib->Create((LPSTR)fn);}BOOL CBmpViewDoc::OnSaveDocument(const char *fn){WORD err;err=m_dib->Save(fn); if (err) CDib::ErrorMessage(err);return err==0;}// CBmpViewDoc serializationvoid CBmpViewDoc::Serialize(CArchive& ar) {{}else{}if (ar.IsStoring())// TODO: add storing code here// TODO: add loading code here// CBmpViewDoc diagnostics#ifdef _DEBUGvoid CBmpViewDoc::AssertValid() constCDocument::AssertValid(); void CBmpViewDoc::Dump(CDumpContext& dc) constCDocument::Dump(dc); ttendif //_DEBUGPewnych modyfikacji wymaga obiekt dokumentu stosowany w aplikacji BMPYIEW.Oczywiście, w pierwszej kolejności musisz dodać do niego obiekt klasy CDib (składowa m_dib) oraz plik nagłówkowy CDIB.H.Ze względu na to, że klasa CDib nie stosuje standardowych metod serializacji MFC, należy przesłonić standardowe definicje metod OnOpenDocument oraz OnSaveDocument Metody te zastąpione zostają przez: wywołania konstruktora lub metody Save klasy CDib.Rozwiązanie takie wypacza standardowy proces serializacji, jednakże podstawowe czynności związane z wyświetleniem okna dialogowego, wyborem wzorca oraz stworzeniem dokumentu pozostają niezmienione.Tak naprawdę, aplikacja BMPY1EW nie potrzebuje prawdziwej serializacji.BMPYIEW nie jest wielką aplikacją, a cała jej wartość polega na umiejętności wyświetlania standardowych plików BMP.W opisanym powyżej przypadku, standardowe metody serializacji stają się niewygodne.Program ani ich nie potrzebuje, ani nie chce używać, dlatego też musi je obejść.Dzięki przesłonięciu standardowych metod OnOpenDocument oraz OnSaveDocument jesteś w stanie przejąć pełną kontrolę nad przebiegiem procesu ładowania i zapisywania plików.Serializacja obiektówSerializacja wygląda w nieco inny sposób, jeśli jedyną rzeczą, do której chcesz jej użyć, jest zapisanie w archiwum stanu obiektu.Gdy zapisujesz całe obiekty, musisz w pierwszej kolejności wywołać metodę Serialize zdefiniowaną w klasie bazowej Twojego obiektu.Dzięki temu, klasa bazowa będzie w stanie zapisać wszystkie potrzebne informacje.W rzeczywistości, obiekty klasy CObject nie przeprowadzają serializacji jakichkolwiek danych.Jednakże nikt nie wie, czy w przyszłych wersjach MFC obiekty tej klasy nie będą stosowały stabilnych danych, które trzeba będzie serializować.Jeśli Twoja klasa wyprowadzona jest z innej klasy, to z dużą dozą prawdopodobieństwa można założyć, że stosowana klasa bazowa będzie chciała przeprowadzić serializację swoich danych.Innym istotnym powodem, dla którego należy przeprowadzać serializację klasy bazowej, jest konieczność zapewnienia poprawnego zapamiętania informacji o Twojej klasie.MFC tworzy i używa specjalnego archiwum, w którym przechowywane są ważne informacje na temat klas, które mogą być serializowane.Archiwum to zawiera, między innymi, nazwy klas, ich wielkości, metody służące do ich tworzenia, wersje klasy i wiele innych informacji.Za pierwszym razem, gdy przeprowadzasz serializację obiektu, MFC zapisuje także informacje o jego klasie
[ Pobierz całość w formacie PDF ]