Zeichnen in einer Ansicht

Fast jede Zeichnung in Ihrer Anwendung erfolgt in der Memberfunktion der Ansicht OnDraw , die Sie in Ihrer Ansichtsklasse überschreiben müssen. (Die Ausnahme ist die Mauszeichnung, die in Interpretieren von Benutzereingaben über eine Ansicht.) Ihre OnDraw Außerkraftsetzung:

  1. Ruft Daten durch Aufrufen der von Ihnen bereitgestellten Dokumentmememmfunktionen ab.

  2. Zeigt die Daten an, indem Memberfunktionen eines Gerätekontextobjekts aufgerufen werden, an das das Framework übergeben wird OnDraw.

Wenn sich die Daten eines Dokuments auf irgendeine Weise ändern, muss die Ansicht neu gezeichnet werden, um die Änderungen widerzuspiegeln. Dies geschieht in der Regel, wenn der Benutzer eine Änderung durch eine Ansicht im Dokument vor nimmt. In diesem Fall ruft die Ansicht die UpdateAllViews-Memberfunktion des Dokuments auf, um alle Ansichten desselben Dokuments zu benachrichtigen, um sich selbst zu aktualisieren. UpdateAllViewsruft die OnUpdate-Memberfunktion jeder Ansicht auf. Die Standardimplementierung von OnUpdate Ungültigkeit des gesamten Clientbereichs der Ansicht. Sie können sie außer Kraft setzen, um nur die Regionen des Clientbereichs zu ungültig zu machen, die den geänderten Teilen des Dokuments zugeordnet sind.

Mit UpdateAllViews der Memberfunktion der Klasse CDocument und der OnUpdate Memberfunktion der Klasse CView können Sie Informationen übergeben, die beschreiben, welche Teile des Dokuments geändert wurden. Mit diesem "Hinweis"-Mechanismus können Sie den Bereich einschränken, den die Ansicht neu zeichnen muss. OnUpdate verwendet zwei "hint"-Argumente. Mit dem ersten , lHint vom Typ "LPARAM" können Sie beliebige Daten übergeben, während der zweite, pHint vom Typ CObject*, einen Zeiger an ein beliebiges Objekt übergeben können, das von CObject.

Wenn eine Ansicht ungültig wird, sendet Windows sie eine WM_PAINT Nachricht. Die OnPaint-Handlerfunktion der Ansicht antwortet auf die Nachricht, indem ein Gerätekontextobjekt der Klasse CPaintDC erstellt und die Memberfunktion der Ansicht OnDraw aufgerufen wird. Normalerweise müssen Sie keine überschreibende OnPaint Handlerfunktion schreiben.

Ein Gerätekontext ist eine Windows-Datenstruktur, die Informationen zu den Zeichnungsattributen eines Geräts enthält, z. B. eine Anzeige oder einen Drucker. Alle Zeichnungsaufrufe werden über ein Gerätekontextobjekt ausgeführt. Beim Zeichnen auf dem Bildschirm OnDraw wird ein CPaintDC Objekt übergeben. Für die Zeichnung auf einem Drucker wird ein CDC-Objekt übergeben, das für den aktuellen Drucker eingerichtet ist.

Der Code zum Zeichnen in der Ansicht ruft zuerst einen Zeiger auf das Dokument ab und führt dann Zeichnungsaufrufe über den Gerätekontext aus. Das folgende einfache OnDraw Beispiel veranschaulicht den Prozess:

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());
}

In diesem Beispiel definieren Sie die GetData Funktion als Mitglied der abgeleiteten Dokumentklasse.

Im Beispiel wird jede Zeichenfolge gedruckt, die sie aus dem Dokument erhält, zentriert in der Ansicht. Wenn der OnDraw Aufruf für die Bildschirmzeichnung gilt, ist das CDC in pDC übergebene Objekt ein CPaintDC Konstruktor, dessen Konstruktor bereits aufgerufen BeginPaintwurde. Aufrufe von Zeichenfunktionen werden über den Gerätekontextzeiger ausgeführt. Informationen zu Gerätekontexten und Zeichnungsaufrufen finden Sie im Klassen-CDC in der MFC-Referenz und beim Arbeiten mit Window-Objekten.

Weitere Beispiele zum Schreiben OnDrawfinden Sie in den MFC-Beispielen.

Siehe auch

Verwenden von Ansichten