Krzysztof Mossakowski
Materiały dla studentów
 

Dokument
(klasa CDocument)

MFC
Spis treści

Dokument
klasa CDocument
Informacje ogólne
Najczęstszy sposób wykorzystania
Serializacja
Obsługa komunikatów
Cykl życia dokumentu
Modyfikacje dokumentu
Hierarchia klas

  •  Informacje ogólne

    • Dokument w rozumieniu aplikacji typu dokument/widok jest zbiorem danych tworzonych lub wczytywanych, modyfikowanych i zapisywanych

    • Klasą obsługującą dokumenty w MFC jest CDocument

    • Podstawowe cechy klasy CDocument:

      • daje podstawową funkcjonalność dokumentów jako zbiorów danych

      • jest bazową klasą dla wszystkich obiektów dokumentów używanych w aplikacjach MFC opartych na architekturze dokument/widok

    • Za prezentację dokumentu odpowiedzialny jest widok, będący obiektem klasy dziedziczącej z CView

      • można znaleźć wszystkie widoki dokumentu korzystając z metod: CDocument::GetFirstViewPosition i CDocument::GetNextView

    • Nie ma ograniczenia liczby typów dokumentów obsługiwanych przez aplikację oraz nie ma ograniczenia liczby widoków dołączonych do jednego typu dokumentów

    • Powiązanie dokumentu z widokiem odbywa się za pośrednictwem wzorca dokumentu
      • widoki powiązane z jednym dokumentem mogą pochodzić z wielu wzorców dokumentu

      • można pobrać wzorzec, z którego pochodzi dokument korzystając z metody CDocument::GetDocTemplate
        - jeśli istnieją co najmniej dwa widoki dokumentu pochodzące z różnych wzorców dokumentu, to metoda ta zwróci wzorzec, który został pierwszy wykorzystany (inaczej mówiąc: wzorzec, przy pomocy którego powstał dokument)

[początek strony]

  •  Najczęstszy sposób wykorzystania

    • Tworzenie własnych typów dokumentów

      • każdy typ dokumentu zdefiniować jako klasę dziedziczącą z CDocument

      • do utworzonej klasy dodać własności charakterystyczne dla dokumentu, które będą danymi dokumentu

      • zaimplementować funkcje odczytu i modyfikacji danych dokumentu

      • zapewnić możliwość wczytania i zapisania dokumentu do pliku - można wykorzystać mechanizm serializacji zaimplementowany w MFC

    • Przy tworzeniu własnego typu dokumentów zwykle powinny zostać nadpisane następujące metody:

      • CDocument::OnNewDocument - wywoływana podczas tworzenia nowego dokumentu

      • CDocument::OnOpenDocument - wywoływana podczas wczytywania istniejącego dokumentu z pliku

      • CDocument::DeleteContents - wywoływana przed zniszczeniem dokumentu, powinna zapewnić zwolnienie pamięci przydzielonej danym dokumentu

[początek strony]

  •  Serializacja

    • Serializacja dokumentów mieści się w schemacie serializacji opracowanym w MFC dla wszystkich klas dziedziczących z klasy CObject.

    • Serializacja dokumentów jest wykorzystywana (jeśli tylko nie została świadomie ominięta) podczas wszystkich operacji odczytu i zapisu dokumentu

      • domyślnie metoda CDocument::Serialize jest wołana w przypadku próby odczytu lub zapisu dokumentu

      • ważnym aspektem serializacji jest zadbanie o prawidłowe zapisywanie każdego obiektu wykorzystywanego w dokumencie (w myśl zasady serializacji w MFC obiekt sam siebie wczytuje i zapisuje)

    • Są dwa sposoby ominięcia serializacji MFC:

      • nadpisanie metody CDocument::Serialize

      • nadpisanie metod CDocument::OnOpenDocument i CDocument::OnSaveDocument (implementacje tych metod w klasie CDocument wołają metodę CDocument::Serialize)

 [początek strony]

  •  Obsługa komunikatów

    • Klasa CDocument dziedziczy z klasy CCmdTarget i ma wbudowaną obsługę komunikatów poprzez mapę komunikatów (message-map)

      • ponieważ dokument nie jest bezpośrednio powiązany z żadnym oknem systemu Windows (pośredniczą widoki), to nie może obsługiwać komunikatów związanych w jakikolwiek sposób z oknami

      • jedynym komunikatem obsługiwanym przez dokumenty może być WM_COMMAND, który obsługuje wszystkie polecenia wydawane za pomocą menu, okna toolbar lub akceleratorów (accelerators)

    • Jeśli dokument nie ma wbudowanej obsługi polecenia (z menu, okna toolbar lub akceleratora), a takie polecenie doszło do tego dokumentu, to zostanie ono przekazane do obsłużenia wzorcowi tego dokumentu.

[początek strony]

  •  Cykl życia dokumentu

    • Cykl życia dokumentu w aplikacji MDI (Multiple-Document Interface), czyli zawierającej wiele okien roboczych, które mogą przedstawiać różne dokumenty:

      • dokument jest dynamicznie tworzony, wywoływany jest konstruktor

      • wywoływana jest jedna z dwóch metod: CDocument::OnNewDocument (jeśli tworzony jest nowy dokument) lub CDocument::OnOpenDocument (jeśli wczytywany jest już istniejący dokument)

      • po zakończeniu pracy z dokumentem wywoływana jest metoda CDocument::DeleteContents, w której powinno się znaleźć zwalnianie pamięci dynamicznie przydzielonej dokumentowi

      • wywoływany jest destruktor i dokument jest niszczony

    • Cykl życia dokumentu w aplikacji SDI (Single-Document Interface), czyli takiej, w której nie mogą być równocześnie otwarte dwa dokumenty:

      • zawsze w aplikacji istnieje jeden dokument, jego konstruktor wywoływany jest przy starcie, a destruktor przy końcu pracy aplikacji

      • w przypadku tworzenia lub wczytywania innego dokumentu zostanie wywołana jedna z metod CDocument::OnNewDocument lub CDocument::OnOpenDocument dla tego samego obiektu, który zawierał poprzednio otwarty dokument

      • po zakończeniu pracy z dokumentem wywoływana jest metoda CDocument::DeleteContents, w której powinno się znaleźć zwalnianie pamięci dynamicznie przydzielonej dokumentowi

[początek strony]

  •  Modyfikacje dokumentu

    • Po dokonaniu zmian w dokumencie powinny zostać wywołane następujące metody:

      • CDocument::SetModifiedFlag - ustawia flagę modyfikacji dokumentu, która jest sprawdzana przy zamykaniu dokumentu, w przypadku próby zamknięcia zmodyfikowanego dokumentu zostanie wyświetlony przez aplikację komunikat i użytkownik będzie miał możliwość zapisania dokumentu; po zapisie flaga modyfikacji zostanie wyczyszczona

      • CDocument::UpdateAllViews - dla każdego widoku dokumentu wywołuje metodę CView::OnUpdate mającą na celu uatktualnienie widoku

[początek strony]

  •  Hierarchia klas

    CObject - informacja w trakcie wykonywania, dynamiczne tworzenie, serializacja
        CCmdTarget - obsługa komunikatu WM_COMMAND
            CDocument

[początek strony]