Windows Programmierung: GDI
Willemers Informatik-Ecke
Das GDI (Graphics Device Interface) ist die Komponente des Windows für die Grafikprimitive. Es steht zwischen Applikation und Grafik Hardwaretreibern.

Device Context (DC)

Die grafischen Operationen haben einen Devicekontext als Ziel. Dieser Kontext kennt die physikalischen Eigenschaften der Grafikeinheit. So hat ein Drucker beispielsweise höhere Auflösung, aber weniger Farben als der Bildschirm.

Zeichnen im Fenster

Wird mit Fenstern gearbeitet, muss das Programm jederzeit den Fensterinhalt wiederherstellen können, wenn ein anderes Fenster den Inhalt zwischenzeitlich verdeckt hatte. Um die Zeichenroutinen nicht doppelt zu schreiben, geht man beim Zeichnen so vor, dass man die Rekonstruktion des neuen Bildes vorbereitet und anschliessend dem System vortäuscht, es müsse das Fenster neu zeichnen. Zu diesem Zweck gibt es die Funktion InvalidateRect. Es löst die Nachricht WM_PAINT aus. Das Zeichnen in einem Windowsprogramm erfolgt also typischerweise als Reaktion auf die Nachricht WM_PAINT. Speziell für diese Situation gibt es das Funktionspaar BeginPaint und EndPaint.

HDC hdc;
 ...
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// hier wird gezeichnet
		EndPaint(hWnd, &ps);
		break;

Zeichnen mit dem Drucker

Das Drucken wird an anderer Stelle ausführlich behandelt. Prinzipiell wird in diesem Fall ein DC vom Druckdialog geliefert.

GDI Objekte

Objekte des GDI sind Pen, Brush, Font, Palette, Region und Bitmap. Sie werden jeweils mit einem speziellen Create-Aufruf erzeugt und parametrisiert. Durch SelectObject wird das Objekt an den Devicekontext gebunden und aktiviert. Nach Abschluss der Arbeiten sollte genau darauf geachtet werden, dass das Objekt per DeleteObject wieder freigegeben wird.

PEN

HPEN ist das Handle auf einen Pen (engl. Stift), das man durch Aufruf der Funktion CreatePen erhält. Der Stift bestimmt das Aussehen der Linien.

HPEN CreatePen(int Stil, int LinienBreite, COLORREF Farbe);

Stil
PS_SOLID durchgehende Linie
PS_DASH unterbrochene Linie
PS_DOT gepunktete Linie
PS_DASHDOT Strich-Punkt Linie
PS_DASHDOTDOT Strich-Punkt-Punkt Linie
PS_NULL unsichtbare Linie
PS_INSIDEFRAME hat eine Sonderstellung. Wird dieser Pen beim Zeichnen umrahmender Rechtecke verwendet, wird die Linie innerhalb des Rechtecks gezeichnet.
LinienBreite
in logischen Einheiten.
Farbe
kann durch das RGB(BYTE rot, BYTE gruen, BYTE blau)-Makro festgelegt werden.

BRUSH

Während der Pen die Linien festlegt, beschreibt der Brush (engl. Pinsel) die Füllflächen.

CreateSolidBrush

Mit dieser Funktion wird eine Einfärbung der Füllflächen ohne Muster erreicht.

HBRUSH CreateSolidBrush(COLORREF Farbe);

CreateHatchBrush

Der hier erzeugte Brush hat eine Musterung.

HBRUSH CreateHatchBrush(int Stil, COLORREF Farbe);

Der Stil wird durch eine der folgenden Konstanten bestimmt:
HS_BDIAGONAL 45 Grad von links nach rechts abfallende Diagonalen
HS_CROSS gekreuzte horizontale und vertikale Linien
HS_DIAGCROSS wie HS_CROSS, nur 45 Grad
HS_FDIAGONAL 45 Grad von links nach rechts steigende Diagonalen
HS_HORIZONTAL horizontale Linien
HS_VERTICAL vertikale Linien

CreatePatternBrush

Es kann auch eine Bitmap als Musterung für Füllungen verwendet werden.

HBRUSH CreatePatternBrush(HBITMAP hbmp);

Zeichenoperationen

Linie MoveToEx, dann LineTo
Rechteck (gefüllt) BOOL Rectangle(HDC hdc, int links, int oben, int rechts, int unten);
Ellipse (gefüllt) BOOL Ellipse(HDC hdc, int links, int oben, int rechts, int unten);
Polygon BOOL PolyDraw(HDC hdc, POINT *PunktArray, BYTE *TypArray, int PunktZahl);
Kreisausschnitt Arc und AngleArc
Text TextOut(hdc, int x, int y, LPCWSTR, int strlen) und DrawTextEx (formatiert im Rechteck)

Die Funktionen mit dem Ex am Ende sind in Win32 hinzugekommen und ersetzen die bisherigen Aufrufe, sind also nicht unter Windows 3.x verfügbar. In den meisten Fällen liegt der Unterschied in den 32bit-Zeichenkoordinaten, die unter Windows 3.x noch 16 Bit breit waren.

Alle Linien halten sich an den geltenden Pen. Die gefüllten Elemente werden mit dem aktuell für den DC geltenden Brush gefüllt.

Anders sind die Textroutinen. Hier werden die Farben durch SetTextColor bzw. SetBkColor gesetzt.