GDI-Objekte und Hilfsklassen

Die meisten der im Anschluss an diese Lektion beschriebenen Text- und Grafikfunktionen benötigen für die Ausgabe lediglich Positions- und Größenangaben. Die notwendigen Attribute für die Darstellung, wie z.B. die Farbe oder auch die Strichstärke für Linien, müssen vorher durch entsprechende GDI-Objekte eingestellt werden. Die gemeinsame Basisklasse für alle GDI-Objekte ist die Klasse CGdiObject. CGdiObject ist wiederum von der Klasse CObject abgeleitet die es gestattet, auch die GDI-Objekt zu serialisieren.

In einer Anwendung werden Sie aber nie ein Objekt der Klasse CGdiObject selbst erstellen, sondern immer ein Objekt einer davon abgeleiteten Klasse. Die nachfolgende Tabelle enthält eine Übersicht über die zur Verfügung stehenden GDI-Objekte. Wofür die einzelnen Objekte eingesetzt werden erfahren Sie im weiteren Verlaufe dieses Kapitels.

GDI-Objekt

MFC-Klasse

Pen (Stift) CPen
Brush (Pinsel) CBrush
Font (Zeichensatz) CFont
Region (Clipping-Bereich) CRegion
Bitmap CBitmap
Palette (Farbtabelle) CPalette

Um mit einem GDI-Objekt arbeiten zu können, müssen in der Regel folgende vier Schritte durchgeführt werden:

no1.gif (995 Byte) Das gewünschte GDI-Objekt wird (in der Regel) lokal erstellt und anschließend mit seiner Create(...) Methode initialisiert. Alternativ können einige der GDI-Objekte auch bei der Erstellung über ihren Konstruktor bereits initialisiert werden.
no2.gif (1016 Byte) Auswählen des so erstellten GDI-Objektes für die nachfolgenden Zeichenoperationen.
no3.gif (1017 Byte) Auswählen des ursprünglichen GDI-Objektes.
no4.gif (1014 Byte) Löschen des im Schritt 1 erstellen GDI-Objektes.

Sehen wir uns diese vier Schritte nun in einem Auszug aus einem Listing an:

// Die Zeichen-Methode
void CMyView::OnDraw (CDC* pDC)
{
    CPen    *pCOldPen;    
// Zeiger auf urspruengl. Stift
    // no1.gif (995 Byte) Erstellen des gewuenschten Stifts
    CPen     CBlackPen (PS_SOLID, 1, COLORREF(0x000000));
    // no2.gif (1016 Byte) Auswaehlen des Stifts fuer nachfolgende Operationen
    //      und abspeichern des alten Stifts
    pCOldPen = pDC->SelectObject (&CBlackPen);
    // Ab hier wird mit dem neuen Stift gemalt
   ....
    // no3.gif (1017 Byte) Wiederherstellen des alten Stifts
    pDC->SelectObject (pCOldPen);
}
// no4.gif (1014 Byte) Hier wird der neue Stift automatisch geloescht

Im obigen Listen wir zuerst ein schwarzer, durchgezogener Stift mit der logischen Stärke '1' erstellt. Mehr zur Erstellung von Stiften und deren Attribute in der nachfolgenden Lektion Stifte und Linien.

Erzeugen Sie ein GDI-Objekt nicht lokal, so wie im obigen Listing, sondern dynamisch durch Aufruf des new-Operators, so vergessen Sie nicht dieses GDI-Objekt auch wieder mittels des delete-Operators zu löschen. GDI-Objekte belegen ebenfalls Systemressourcen die nicht unbegrenzt zur Verfügung stehen.

Danach wird der Stift für die nachfolgenden Zeichenoperationen ausgewählt. Die Auswahl eines GDI-Objektes erfolgt in der Regel über eine der folgenden CDC-Methoden:

CPen* SelectObject( CPen* pPen );
CBrush* SelectObject( CBrush* pBrush );
virtual CFont* SelectObject( CFont* pFont );
CBitmap* SelectObject( CBitmap* pBitmap );
int SelectObject( CRgn* pRgn );

Alle SelectObject(...) Methode erhalten als Parameter einen Zeiger auf das für die nachfolgenden Zeichenoperationen zu verwendende GDI-Objekt, das vorher natürlich erstellt worden sein muss. Bis auf auf die letzte Methode liefern alle Methoden einen Zeiger auf das bisher aktuelle GDI-Objekt zurück. So liefert z.B. der Aufruf der Methode SelectObject(&CMyPen) einen Zeiger auf das bisherige CPen-Objekt.

Es kann von jedem GDI-Objekt zu einem Zeitpunkt jeweils nur eines aktiv sein. d.h. es ist nicht möglich, zwei Stifte zum Zeichnen zu aktivieren. Wollen Sie mit einem anderen Stift weiterzeichnen, so müssen sie diesen zuerst mittels SelectObject(...) aktivieren.

Damit beenden wir vorläufig die Behandlung der GDI-Objekte und sehen  uns noch kurz in tabellarischer Form diverse Hilfsklassen an die bei den verschiedenen Zeichenmethoden der Klasse CDC zum Einsatz kommen.

Hilfsklasse

Einsatzgebiet

CPoint Die Klasse CPoint dient hauptsächlich zum Abspeichern von Koordinaten. Sie enthält die public int-Eigenschaften x und y. Außerdem stellt die Klasse etliche Methoden bereit um diese Eigenschaften zu manipulieren. So enthält die Klasse verschiedene Methoden um z.B. zwei CPoint-Objekte zu vergleichen oder die in ihr abgespeicherten Koordinaten zu verschieben.
CSize Sie dient zum Abspeichern von Größenangaben und enthält die public int-Eigenschaften cx und cy. Ebenso wie CPoint besitzt auch diese Klasse eine Reihe von Methoden um die abgelegt Daten vergleichen und manipulieren zu können.
CRect Sie wird zum Abspeichern von Rechteckdaten eingesetzt und enthält die vier public int-Eigenschaften left, top, right und bottom. Beachten Sie bitte beim Erstellen eines CRect-Objekts, dass die Daten in normalisierter Form angegeben werden sollten, d.h. der Wert für left sollte kleiner als der Wert für right sein und der Wert für top sollte kleiner als der für bottom sein

Damit beenden wir die Einführung ins GDI und wenden uns in der nächsten Lektionen dem Zeichnen von Linien zu.



Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470