Udostępnij za pośrednictwem


Rysowanie w widoku

Prawie cały rysunek w aplikacji występuje w funkcji składowej widoku OnDraw , którą należy zastąpić w klasie widoków. (Wyjątek to rysunek myszy, omówiony w Interpretowanie danych wejściowych użytkownika za pośrednictwem widoku). Przesłonięcia OnDraw :

  1. Pobiera dane, wywołując podane funkcje składowe dokumentu.

  2. Wyświetla dane przez wywołanie funkcji składowych obiektu kontekstu urządzenia, który platforma przekazuje do OnDrawelementu .

Gdy dane dokumentu zmieniają się w jakiś sposób, widok musi zostać ponownie wyrysy, aby odzwierciedlić zmiany. Zazwyczaj dzieje się tak, gdy użytkownik wprowadza zmianę w widoku dokumentu. W takim przypadku widok wywołuje funkcję składową UpdateAllViews dokumentu, aby powiadomić wszystkie widoki w tym samym dokumencie o konieczności zaktualizowania siebie. UpdateAllViewswywołuje funkcję składową OnUpdate każdego widoku. Domyślna implementacja OnUpdate unieważnia cały obszar klienta widoku. Można go zastąpić, aby unieważnić tylko te regiony obszaru klienta, które są mapowane na zmodyfikowane fragmenty dokumentu.

UpdateAllViews Funkcja składowa klasy i OnUpdate funkcji składowej klasy CDocument CView umożliwia przekazanie informacji opisujących, które części dokumentu zostały zmodyfikowane. Ten mechanizm "wskazówek" pozwala ograniczyć obszar, który widok musi ponownie rysować. OnUpdate przyjmuje dwa argumenty "wskazówka". Pierwszy, lHint typu LPARAM, umożliwia przekazywanie dowolnych danych, a drugi, pHint, typu CObject*, pozwala przekazać wskaźnik do dowolnego obiektu pochodzącego z CObject.

Gdy widok stanie się nieprawidłowy, system Windows wyśle do niego komunikat WM_PAINT . Funkcja obsługi OnPaint widoku odpowiada na komunikat, tworząc obiekt kontekstu urządzenia klasy CPaintDC i wywołuje funkcję składową widokuOnDraw. Zwykle nie trzeba pisać zastępowającej OnPaint funkcji obsługi.

Kontekst urządzenia to struktura danych systemu Windows zawierająca informacje o atrybutach rysunku urządzenia, takich jak wyświetlacz lub drukarka. Wszystkie wywołania rysunku są wykonywane za pośrednictwem obiektu kontekstu urządzenia. Do rysowania na ekranie OnDraw jest przekazywany CPaintDC obiekt. W przypadku rysowania na drukarce jest przekazywany obiekt CDC skonfigurowany dla bieżącej drukarki.

Kod do rysowania w widoku najpierw pobiera wskaźnik do dokumentu, a następnie wykonuje wywołania rysowania za pośrednictwem kontekstu urządzenia. Poniższy prosty OnDraw przykład ilustruje proces:

void CMyView::OnDraw(CDC* pDC)
{
   CMyDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   CString s = pDoc->GetData();   // Returns a CString
   CRect rect;
   GetClientRect(&rect);

   pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
   pDC->TextOut(rect.right / 2, rect.bottom / 2, s, s.GetLength());
}

W tym przykładzie zdefiniujesz GetData funkcję jako element członkowski klasy pochodnego dokumentu.

W przykładzie jest wyświetlany dowolny ciąg pobierany z dokumentu, wyśrodkowany w widoku. OnDraw Jeśli wywołanie dotyczy rysunku ekranu, CDC obiekt przekazany w centrum dystrybucji kluczy jest konstruktoremCPaintDC, którego konstruktor już o nazwie BeginPaint. Wywołania funkcji rysowania są wykonywane za pośrednictwem wskaźnika kontekstu urządzenia. Aby uzyskać informacje o kontekstach urządzeń i wywołaniach rysowania, zobacz CDC klasy w dokumentacji MFC i pracy z obiektami okna.

Aby uzyskać więcej przykładów sposobu pisania OnDraw, zobacz przykłady MFC.

Zobacz też

Używanie widoków