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 - 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.