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); |
Polygon | BOOL PolyDraw(HDC hdc, POINT *PunktArray, BYTE *TypArray, int PunktZahl); |
Kreisausschnitt | Arc und AngleArc |
Text | TextOut 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.