Krzysztof Mossakowski
Materiały dla studentów
 

Widok
(klasa CView)

MFC
Spis treści

Widok
klasa CView
Informacje ogólne
Najczęstszy sposób wykorzystania
Zadana widoku
Schemat uaktualniania widoku
Rodzaje widoków w standardowych stylach aplikacji
Hierarchia

  •  Informacje ogólne

    • Widok w rozumieniu aplikacji typu dokument/widok jest sposobem prezentacji danych dokumentu, będącego obiektem klasy dziedziczącej z CDocument

      • można pobrać dokument, do którego jest dołączony widok przy pomocy metody CView::GetDocument

    • Klasą obsługującą widoki w MFC jest CView

    • Podstawowe cechy klasy CView:

      • daje podstawową funkcjonalność widoków dokumentów

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

      • w typowych aplikacjach typu dokument/widok jest zawsze dołączony do dokładnie jednego dokumentu, tylko w przypadku ręcznego wyłączenia obsługi tej architektury generowany jest widok bez dokumentu

    • Widok jest oknem w systemie Windows (klasa CView dziedziczy z klasy CWnd) - ma pełną funkcjonalność okna, przede wszystkich jeśli chodzi o obsługę komunikatów Windows

[początek strony]

  •  Najczęstszy sposób wykorzystania

    • Tworzenie własnego widoku lub widoków dla każdego typu dokumentów

      • jeden typ dokumentu może mieć wiele widoków, które mogą pojawiać się w różnych oknach roboczych (w aplikacji MDI - Multiple Document Interface) lub w tym samym oknie podzielonym na dwie lub więcej części przy pomocy splitter

    • Przy tworzeniu własnego widoku najczęściej nadpisane zostaną następujące metody:

      • CView::OnDraw - wywoływana zawsze gdy powinna zostać przedstawiona wizualna postać dokumentu (zarówno na ekranie, jak i na drukarce czy na podglądzie drukowania)

      • CView::OnInitialUpdate - miejsce dokonania specjalnej, jednokrotnej inicjalizacja widoku

      • CView::OnUpdate - wywoływana przed odrysowaniem widoku

      • CView::OnPreparePrinting - ważna podczas wydruku wielostronicowych dokumentów

[początek strony]

  •  Zadania widoku

    • Prezentacja danych dokumentu

      • po zmianie danych dokumentu jest najczęściej wywoływana metoda CDocument::UpdateAllViews, która dla wszystkich istniejących widoków tego dokumentu wywołuje metodę CView::OnUpdate

      • domyślna implementacja metody CView::OnUpdate powoduje wymuszenie odświeżenia (invalidate) całego obszaru roboczego (client area) widoku 
        - jeśli odrysowanie całego widoku zajmuje zbyt dużo czasu należy tak zmodyfikować tę metodę, by wymuszała odświeżenie tylko zmienionej części dokumentu

      • widok odpowiedzialny jest nie tylko za prezentacje dokumentu na ekranie, lecz także na drukarce; w obu przypadkach wywoływana jest ta sama metoda CView::OnDraw lecz dla innego kontekstu urządzenia (device context)

      • zawsze z widoku można otrzymać dokument, z którym jest związany wywołując metodę CView::GetDocument

    • Pośredniczenie pomiędzy użytkownikiem i dokumentem

      • obsługa zmiany sposobu lub parametrów wyświetlania, np. poprzez skrolowanie
        - w obsłudze skrolowania bardzo pomaga dziedziczenie widoku z klasy CScrollView, która ma wbudowane mechanizmy obsługi pionowego i poziomego skrolowania dla widoku
        - można także zrezygnować z tej klasy i samemu napisać zawartość metod CView::OnHScroll i CView::OnVScroll)

      • zmiana danych dokumentów przez użytkownika przy pomocy klawiatury lub myszy

      • wszystkie polecenia wydawane przez użytkownika za pośrednictwem menu, okna toolbar lub akceleratorów są przez główne okno (frame window) przekazywane do widoku, jeśli widok nie potrafi ich obsłużyć są kierowane do dokumentu

[początek strony]

  •  Schemat uaktualniania widoku

    • Użytkownik za pośrednictwem widoku zmienia coś w dokumencie

    • Ten widok po zmodyfikowaniu dokumentu wywołuje CDocument::UpdateAllViews

      • jako parametr można przekazać hint, który odpowiednio interpretowany przez widoki umożliwi wymuszenie odświeżenia (invalidate) tylko części widoku

    • Dla każdego istniejącego widoku tego zmodyfikowanego dokumentu wywoływana jest CView::OnUpdate

      • w tej metodzie nie powinno być kodu odrysowującego zmienione fragmenty widoku, zamiast tego powinien zostać ustawiony obszar, który powinien zostać odświeżony przy następnym odrysowaniu widoku i to odrysowanie powinno zostać wymuszone (np. przy użyciu metody CView::InvalidateRect)

    • Windows po otrzymaniu nakazu wymuszenia odświeżenia widoku wyśle do niego komunikat WM_PAINT

    • Widok po otrzymaniu komunikatu WM_PAINT wywoła metodę CWnd::OnPaint

    • W standardowo nadpisanej dla widoku metodzie CView::OnPaint zostanie utworzony kontekst urządzenia (device context) do rysowania i zostanie przekazany jako parametr do metody CView::OnDraw

    • W nadpisanej metodzie CView::OnDraw musi się znaleźć kod odpowiedzialny za odrysowanie widoku na wskazanym kontekście urządzenia

[początek strony]

  •  Rodzaje widoków w standardowych stylach aplikacji

    • Formularz (form-based)

      • CFormView (dziedzicząca z CView) jako podstawowy widok

      • może to być aplikacja w postaci dialogu (dialog-based application) lub CFormView mogła zostać wybrana jako klasa bazowa dla widoku

      • przy pomocy edytora zasobów (resource editor) można do tworzonej formy dodawać kontrolki Windows, tak jak w przypadku projektowania dialogu

      • automatycznie dodana obsługa danych modyfikowanych w tych kontrolkach (DDX - dialog data exchange)

      • standardowo tworzone widoki w postaci formularzy nie obsługują drukowania, żeby umożliwić wydrukowanie takich widoków należy nadpisać metodę CView::OnPrint

      • nie ma potrzeby nadpisywania CView::OnDraw - na formularzu będą się znajdować tylko kontrolki Windows, a te potrafią się same odrysować

      • automatycznie obsługiwane jest skrolowanie formularza, jeśli jego rozmiar przekracza rozmiar obszar roboczy okna

    • Przeglądarka WWW

      • CHtmlView (dziedzicząca z CView) jako podstawowy widok

      • automatyczna pełna obsługa przeglądarki WWW

      • wymaga co najmniej Windows 95, NT 3.51 oraz zainstalowanego co najmniej Internet Explorer 4.0

      • inna jest obsługa drukowania, nie obsługuje podglądu wydruku

    • Eksplorator

      • podział okna roboczego na dwie części przy pomocy splitter

      • lewa część zawiera drzewo (widok dziedziczący z CTreeView)

      • prawa część zawiera listę (widok dziedziczący z CListView)

[początek strony]

  •  Hierarchia klas

    CObject - informacja w trakcie wykonywania, dynamiczne tworzenie, serializacja
        CCmdTarget - obsługa komunikatów Windows
            CWnd - okno
                CView
        
               
    CCtrlView - widok będący kontrolką Windows (control)
                        CTreeView - kontrolka drzewa (CTreeCtrl)
                        CListView - kontrolka listy (CListCtrl)
                        CEditView - zwykłe okno edycyjne
                        CRichEditView - kontrolka edycyjna dla RTF (CRichEditCtrl)
                    CScrollView - automatyczna obsługa skrolowania
                        CFormView - formularze jako widoki
                        CHtmlView - przeglądarka WWW
                        CRecordView - rekord bazy danych ODBC
                        CDaoRecordView - rekord bazy danych DAO
                        COleDBRecordView - rekord OLE DB

[początek strony]