Rysowanie
klasa CDC
|
|
-
-
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
-
W programach pisanych przy użyciu
MFC zalecane jest korzystanie z klasy CDC i jej składowych
zamiast funkcji API
[początek strony]
-
-
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]
-
-
Klasa CDC jest tylko
interfejsem dla obiektów HDC istniejących w Windows
-
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]
-
-
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
[początek strony]
-
-
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
[początek strony]
[początek strony]
|