Status eines Grafikobjekts

Die Graphics-Klasse ist das Kernstück von Windows GDI+. Um alles zu zeichnen, erstellen Sie ein Graphics-Objekt, legen dessen Eigenschaften fest und rufen dessen Methoden auf ( DrawLine, DrawImage, DrawStringund ähnliches).

Das folgende Beispiel erstellt ein Graphics-Objekt und ein Pen-Objekt und ruft dann die Graphics::D rawRectangle-Methode des Graphics-Objekts auf:

HDC          hdc;
PAINTSTRUCT  ps;

hdc = BeginPaint(hWnd, &ps);
{
   Graphics graphics(hdc);
   Pen pen(Color(255, 0, 0, 255));  // opaque blue
   graphics.DrawRectangle(&pen, 10, 10, 200, 100);
}
EndPaint(hWnd, &ps);

Im vorangehenden Code gibt die BeginPaint-Methode ein Handle an einen Gerätekontext zurück, und dieses Handle wird an den Grafikkonstruktor übergeben. Ein Gerätekontext ist eine Struktur (die von Windows verwaltet wird), die Informationen über das jeweilige verwendete Anzeigegerät enthält.

Grafikzustand

Ein Graphics-Objekt stellt mehr als Zeichnungsmethoden bereit, z. B. DrawLine und DrawRectangle. Ein Graphics-Objekt verwaltet auch den Grafikzustand, der in die folgenden Kategorien unterteilt werden kann:

  • Ein Link zu einem Gerätekontext
  • Qualitätseinstellungen
  • Transformationen
  • Ein Ausschneidebereich

Gerätekontext

Als Anwendungsprogrammierer müssen Sie sich keine Gedanken über die Interaktion zwischen einem Grafikobjekt und dessen Gerätekontext machen. Diese Interaktion wird von GDI+ im Hintergrund verarbeitet.

Quality Einstellungen

Ein Grafikobjekt verfügt über mehrere Eigenschaften, die die Qualität der Elemente beeinflussen, die auf dem Bildschirm gezeichnet werden. Sie können diese Eigenschaften anzeigen und bearbeiten, indem Sie get- und set-Methoden aufrufen. Beispielsweise können Sie die Graphics::SetTextRenderingHint-Methode aufrufen, um den Typ des Antialiasings (falls vorhanden) anzugeben, das auf Text angewendet wird. Andere Set-Methoden, die die Qualität beeinflussen, sind Graphics::SetSmoothingMode, Graphics::SetCompositingMode, Graphics::SetCompositingQualityund Graphics::SetInterpolationMode.

Im folgenden Beispiel werden zwei Ellipsen gezogen: eine mit dem Glättungsmodus auf "SmoothingModeAntiAlias" und eine mit dem Glättungsmodus auf "SmoothingModeHighSpeed":

Graphics graphics(hdc);
Pen pen(Color(255, 0, 255, 0));  // opaque green

graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.DrawEllipse(&pen, 0, 0, 200, 100);
graphics.SetSmoothingMode(SmoothingModeHighSpeed);
graphics.DrawEllipse(&pen, 0, 150, 200, 100);

Transformationen

Ein Graphics-Objekt verwaltet zwei Transformationen (Welt und Seite), die auf alle elemente angewendet werden, die von diesem Graphics-Objekt gezeichnet werden. Jede affine Transformation kann in der weltweiten Transformation gespeichert werden. Affine Transformationen umfassen Skalierung, Drehung, Reflektion, Skewing und Übersetzung. Die Seitentransformation kann für die Skalierung und zum Ändern von Einheiten (z. B. Pixel in Zoll) verwendet werden. Weitere Informationen zu Transformationen finden Sie unter Koordinatensysteme und Transformationen.

Im folgenden Beispiel werden die Welt- und Seitentransformationen eines Graphics-Objekts festgelegt. Die Welttransformation ist auf eine 30-Grad-Drehung festgelegt. Die Seitentransformation ist so festgelegt, dass die an die zweite Graphics::D rawEllipse übergebenen Koordinaten als Millimeter anstelle von Pixeln behandelt werden. Der Code ruft die Graphics::D rawEllipse-Methode auf zwei identische Weise auf. Die World-Transformation wird auf den ersten Graphics::D rawEllipse-Aufruf angewendet, und beide Transformationen (world und page) werden auf den zweiten Graphics::D rawEllipse-Aufruf angewendet.

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0));

graphics.ResetTransform();
graphics.RotateTransform(30.0f);            // World transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);
graphics.SetPageUnit(UnitMillimeter);       // Page transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);

Die folgende Abbildung zeigt die beiden Ausellipsen. Beachten Sie, dass die 30-Grad-Drehung den Ursprung des Koordinatensystems (obere linke Ecke des Clientbereichs) und nicht die Mittelpunkte der Ellipsen betrifft. Beachten Sie auch, dass die Stiftbreite von 1 1 Pixel für die erste Ellipse und 1 Millimeter für die zweite Ellipse bedeutet.

Screenshot eines Fensters mit einer kleinen, schlanken Ellipse und einer großen, breiteren Ellipse

Ausschneidebereich

Ein Graphics-Objekt verwaltet einen Clippingbereich, der für alle von diesem Graphics-Objekt gezeichneten Elemente gilt. Sie können den Clippingbereich festlegen, indem Sie die SetClip-Methode aufrufen.

Im folgenden Beispiel wird ein plusförmiger Bereich erstellt, indem die Union von zwei Rechtecke gebildet wird. Dieser Bereich wird als Ausschneidebereich eines Graphics-Objekts festgelegt. Anschließend zeichnet der Code zwei Zeilen, die auf das Innere des Ausschneidebereichs beschränkt sind.

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0), 5);  // opaque red, width 5
SolidBrush brush(Color(255, 180, 255, 255));  // opaque aqua

// Create a plus-shaped region by forming the union of two rectangles.
Region region(Rect(50, 0, 50, 150));
region.Union(Rect(0, 50, 150, 50));
graphics.FillRegion(&brush, &region);

// Set the clipping region.
graphics.SetClip(&region);

// Draw two clipped lines.
graphics.DrawLine(&pen, 0, 30, 150, 160);
graphics.DrawLine(&pen, 40, 20, 190, 150);

Die folgende Abbildung zeigt die abgeschnittenen Zeilen.

Abbildung einer farbigen Form, die durch zwei diagonale rote Linien gekreuzt wird