Krzysztof Mossakowski
Materiały dla studentów
 

Rysowanie
(klasa CDC)

MFC
Spis treści

Rysowanie
klasa CDC
Informacje ogólne
Najczęstszy sposób wykorzystania
Cechy klasy CDC
Klasy dziedziczące z CDC
Obiekty graficzne
Hierarchia klas

  •  Informacje ogólne

    • W Windows wszystkie czynności rysowania muszą odbywać się na kontekście urządzenia (device context)

      • kontekst urządzenia jest trzymany w Windows w postaci uchwytu HDC i jest przekazywany jako parametr do większości funkcji rysujących

      • kontekst przechowuje ustawione wartości atrybutów rysowania, np. viewport, tryb mapowania współrzędnych, aktualnie wybrane obiekty graficzne

    • MFC daje klasę CDC, która jest interfejsem dla kontekstu urządzenia

      • większość funkcji API do obsługi kontekstów urządzeń posiada swoje odpowiedniki w klasie CDC

      • składowa CDC::m_hDC daje dostęp do uchwytu kontekstu trzymanego przez Windows

    • W programach pisanych przy użyciu MFC zalecane jest korzystanie z klasy CDC i jej składowych zamiast funkcji API

[początek strony]

  •  Najczęstszy sposób wykorzystania

    • Najczęściej wykorzystywany jest już istniejący kontekst urządzenia (istniejący w Windows jako HDC)
      • w obsłudze komunikatu WM_PAINT kontekst jest pobierany i zwalniany przy użyciu metod: CWnd::BeginPaint i CWnd::EndPaint
      • w obsłudze WM_PAINT dla widoków w aplikacjach wykorzystujących architekturę dokument/widok w metodzie CView::OnPaint jest pobierany kontekst do rysowania, następnie ustawiane są jego atrybuty w metodzie CView::OnPrepareDC (np. tryb mapowania, viewport w CScrollView) i jest przekazywany jako parametr do metody CView::OnDraw, w której powinien się znaleźć odpowiedni kod rysujący
      • jeśli zachodzi potrzeba narysowania w okienku (w obszarze roboczym - client area) lub na okienku (poza obszarem roboczym) poza obsługą WM_PAINT należy używać obiektów z klas, odpowiednio, CClientDC i CWindowDC
        - do konstruktorów tych obiektów należy jako parameter przekazać okno CWnd - dalsza inicjalizacja odbędzie się automatycznie
    • Przy użyciu klasy CDC można tworzyć nowe konteksty urządzeń:
      • CDC::CreateDC - utworzenie dla podanego urządzenia
      • CDC::CreateCompatibleDC - utworzenie zgodnego z kontekstem przekazanym do tej funkcji jako parametr
      • CDC::CreateIC - utworzenie kontekstu informacyjnego dla wskazanego urządzenia - w ten sposób można pobrać informacje o urządzeniu bez potrzeby tworzenia rzeczywistego kontekstu urządzenia
    • Niszczyć można tylko konteksty stworzone przez siebie, nie można niszczyć istniejących w Windows kontekstów pobranych tylko do użycia
      • tylko konteksty stworzone przy użyciu metod: CDC::CreateDC, CDC::CreateCompatibleDC i CDC::CreateIC powinny być niszczone przy użyciu funkcji CDC::DeleteDC

[początek strony]

  •  Cechy klasy CDC

    • Klasa CDC jest tylko interfejsem dla obiektów HDC istniejących w Windows

      • możliwe jest istnienie obiektu klasy CDC bez HDC

      • przy pomocy metod CDC::Attach i CDC::Detach można do obiektu klasy CDC dołączać istniejący w Windows HDC i odłączać go

    • Każdy obiekt CDC zawiera dwa uchwyty HDC:

      • CDC::m_hDC - wykorzystywany gdy cokolwiek ma zostać narysowane lub ustawione (czyli operacje na wyjściu)

      • CDC::m_hAttribDC - wykorzystywany podczas pobieranie ustawień z kontekstu (czyli operacje na wejściu)

      • zwykle oba uchwyty są sobie równe (istnieje tylko jeden kontekst urządznia)
        - te składowe mają różne wartości w obiektach klas CPreviewDC i CMetaFileDC

    • Większość funkcji API wykorzystujących HDC ma swoje odpowiedniki w klasie CDC z tą samą nazwą lecz mniejszą liczbą parametrów

[początek strony]

  •  Klasy dziedziczące z CDC

    • CPaintDC

      • wykorzystywana tylko do rysowania podczas obsługi komunikatu WM_PAINT

      • konstruktor woła CWnd::BeginPaint, destruktor CWnd::EndPaint

      • obiekt tej klasy trafia jako parametr do metody CView::OnDraw, gdzie powinien znajdować się kod rysujący widok dokumentu (w aplikacjach wykorzystujących architekturę dokument/widok)

    • CClientDC

      • obsługuje kontekst urządzenia w obszaru roboczego (client area) okna

      • konstruktor woła CWnd::GetDC, destruktor CWnd::ReleaseDC

    • CWindowDC

      • obsługuje kontekst urządzenia całego okna

      • konstruktor woła CWnd::GetWindowDC, destruktor CWnd::ReleaseDC

    • CMetaFileDC

      • metafile Windows jest plikiem zawierającym sekwencje poleceń GDI

      • rysowanie odbywa się tak samo jak w przypadku zwykłych kontekstów urządzeń, lecz trafia do pliku
        - jedyną różnicą jest konieczność ręcznego wywoływania funkcji CView::OnPrepareDC w przypadku wykorzystywania metafile z widoków

      • utworzony metafile można odtworzyć na innym kontekście urządzenia przy pomocy metody CDC::PlayMetaFile

    • CPreviewDC

      • nieudokumentowana klasa wykorzystywana podczas tworzenia podglądów wydruków

[początek strony]

  •  Obiekty graficzne

    • W MFC zawarte są klasy będące interfejsami dla istniejących w Windows rodzajów obiektów graficznych (wszystkie niżej wymienione klasy dziedziczą z CGdiObject):

      • CPen (obsługa HPEN)

      • CBrush (HBRUSH)

      • CFont (HFONT)

      • CBitmap (HBITMAP)

      • CPalette (HPALETTE)

      • CRgn (HRGN)

    • Najczęściej stosowany schemat wykorzystania obiektów graficznych:

      • stworzenie obiektu odpowiedniej klasy i inicjalizacja przy pomocy metody Create... (np. CPen::CreatePen)
        - tworzenie i inicjalizacja mogą być połączone w konstruktorze z większą liczbą parametrów

      • wybranie obiektu jako aktualnego dla kontekstu urządzenia (przy pomocy funkcji CDC::SelectObject)

      • rysowanie na kontekście urządzenia z zastosowaniem wybranego obiektu

      • przywrócenie poprzedniego obiektu (CDC::SelectObject)

      • jeśli obiekt został utworzony dynamicznie (rzadko jest taka potrzeba), powinien zostać zniszczony

    • Metoda CDC::SelectObject zwraca wskaźnik do obiektu, który automatycznie zniszczony w CWinApp::OnIdle

      • mogą stąd wynikać problemy podczas prób użycia tego obiektu poza obsługą tylko jednego komunikatu

[początek strony]

  •  Hierarchia klas

    CObject - informacja w trakcie wykonywania, dynamiczne tworzenie, serializacja
       CDC
            CPaintDC
            CClientDC
            CWindowDC
            CMetaFileDC
            CPreviewDC
        CGdiObject
            CPen
            CBrush
            CFont
            CBitmap
            CPalette
            CRgn

[początek strony]