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:
Ruft Daten durch Aufrufen der von Ihnen bereitgestellten Dokumentmememmfunktionen ab.
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. UpdateAllViews
ruft 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 BeginPaint
wurde. 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 OnDraw
finden Sie in den MFC-Beispielen.