Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Windows GDI+ stellt Container bereit, die Sie verwenden können, um einen Teil des Zustands in einem Graphics-Objekt vorübergehend zu ersetzen oder zu erweitern. Sie erstellen einen Container, indem Sie die Graphics::BeginContainer- Methode eines Graphics-Objekts aufrufen. Sie können Graphics::BeginContainer wiederholt aufrufen, um geschachtelte Container zu bilden.
Transformationen in geschachtelten Containern
Im folgenden Beispiel wird ein Graphics-Objekt und ein Container innerhalb dieses Graphics-Objekts erstellt. Die Welttransformation des Graphics-Objekts ist eine Übersetzung von 100 Einheiten in x-Richtung und 80 Einheiten in y-Richtung. Die Welttransformation des Containers ist eine Drehung von 30 Grad. Der Code führt den Aufruf aus
DrawRectangle(&pen, -60, -30, 120, 60)
zweimal. Der erste Aufruf von Graphics::D rawRectangle ist innerhalb des Containers; Das heißt, der Aufruf befindet sich zwischen den Aufrufen von Graphics::BeginContainer und Graphics::EndContainer. Der zweite Aufruf von Graphics::D rawRectangle liegt nach dem Aufruf von Graphics::EndContainer.
Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0));
GraphicsContainer graphicsContainer;
graphics.TranslateTransform(100.0f, 80.0f);
graphicsContainer = graphics.BeginContainer();
graphics.RotateTransform(30.0f);
graphics.DrawRectangle(&pen, -60, -30, 120, 60);
graphics.EndContainer(graphicsContainer);
graphics.DrawRectangle(&pen, -60, -30, 120, 60);
Im vorherigen Code wird das rechteck, das aus dem Container gezeichnet wird, zuerst durch die Welttransformation des Containers (Drehung) und dann durch die Welttransformation des Graphics-Objekts (Übersetzung) transformiert. Das Rechteck, das von außerhalb des Containers gezeichnet wird, wird nur durch die Welttransformation des Graphics-Objekts (Übersetzung) transformiert. Die folgende Abbildung zeigt die beiden Rechtecke.
Beschneiden in geschachtelten Containern
Im folgenden Beispiel wird veranschaulicht, wie geschachtelte Container Clippingbereiche behandeln. Der Code erstellt ein Graphics-Objekt und einen Container innerhalb dieses Graphics-Objekts. Der Clippingbereich des Graphics-Objekts ist ein Rechteck, und der Beschneidungsbereich des Containers ist eine Ellipse. Der Code führt zwei Aufrufe der Graphics::D rawLine-Methode durch. Der erste Aufruf von Graphics::D rawLine- befindet sich innerhalb des Containers, und der zweite Aufruf von Graphics::D rawLine- befindet sich außerhalb des Containers (nach dem Aufruf von Graphics::EndContainer). Die erste Zeile wird durch die Schnittmenge der beiden Beschneidungsbereiche abgeschnitten. Die zweite Linie wird nur durch den rechteckigen Clippingbereich des Graphics-Objekts abgeschnitten.
Graphics graphics(hdc);
GraphicsContainer graphicsContainer;
Pen redPen(Color(255, 255, 0, 0), 2);
Pen bluePen(Color(255, 0, 0, 255), 2);
SolidBrush aquaBrush(Color(255, 180, 255, 255));
SolidBrush greenBrush(Color(255, 150, 250, 130));
graphics.SetClip(Rect(50, 65, 150, 120));
graphics.FillRectangle(&aquaBrush, 50, 65, 150, 120);
graphicsContainer = graphics.BeginContainer();
// Create a path that consists of a single ellipse.
GraphicsPath path;
path.AddEllipse(75, 50, 100, 150);
// Construct a region based on the path.
Region region(&path);
graphics.FillRegion(&greenBrush, ®ion);
graphics.SetClip(®ion);
graphics.DrawLine(&redPen, 50, 0, 350, 300);
graphics.EndContainer(graphicsContainer);
graphics.DrawLine(&bluePen, 70, 0, 370, 300);
Die folgende Abbildung zeigt die beiden beschnittenen Linien.
Wie die beiden vorherigen Beispiele zeigen, sind Transformationen und Clippingbereiche in geschachtelten Containern kumulativ. Wenn Sie die Welttransformationen des Containers und das Graphics-Objekt festlegen, gelten beide Transformationen für Elemente, die aus dem Container gezeichnet wurden. Die Transformation des Containers wird zuerst angewendet, und die Transformation des Graphics-Objekts wird zweiten angewendet. Wenn Sie die Beschneidungsbereiche des Containers und das Graphics-Objekt festlegen, werden elemente, die aus dem Container gezeichnet werden, vom Schnittpunkt der beiden Beschneidungsbereiche abgeschnitten.
Qualitätseinstellungen in geschachtelten Containern
Qualitätseinstellungen ( SmoothingMode, TextRenderingHint-usw.) in geschachtelten Containern sind nicht kumulativ; Stattdessen ersetzen die Qualitätseinstellungen des Containers vorübergehend die Qualitätseinstellungen eines Graphics-Objekts. Wenn Sie einen neuen Container erstellen, werden die Qualitätseinstellungen für diesen Container auf Standardwerte festgelegt. Angenommen, Sie haben ein Graphics-Objekt mit einem Glättungsmodus von SmoothingModeAntiAlias. Wenn Sie einen Container erstellen, ist der Glättungsmodus innerhalb des Containers der Standardglättungsmodus. Sie können den Glättungsmodus des Containers festlegen, und alle Elemente, die aus dem Container gezogen werden, werden entsprechend dem von Ihnen festgelegten Modus gezeichnet. Elemente, die nach dem Aufruf von Graphics::EndContainer gezeichnet werden, werden gemäß dem Glättungsmodus (SmoothingModeAntiAlias) gezeichnet, das vor dem Aufruf von Graphics::BeginContainerausgeführt wurde.
Mehrere Ebenen geschachtelter Container
Sie sind nicht auf einen Container in einem Graphics-Objekt beschränkt. Sie können eine Abfolge von Containern erstellen, die jeweils im Vorherigen geschachtelt sind, und Sie können die Welttransformation, den Clippingbereich und die Qualitätseinstellungen für jeden dieser geschachtelten Container angeben. Wenn Sie eine Zeichnungsmethode aus dem innersten Container aufrufen, werden die Transformationen in der Reihenfolge angewendet, beginnend mit dem innersten Container und endet mit dem äußersten Container. Elemente, die aus dem innersten Container gezeichnet werden, werden durch den Schnittpunkt aller Beschneidungsbereiche abgeschnitten.
Im folgenden Beispiel wird ein Graphics-Objekt erstellt und der Textrenderinghinweis auf TextRenderingHintAntiAliasfestgelegt. Der Code erstellt zwei Container, die in der anderen geschachtelt sind. Der Textrenderinghinweis des äußeren Containers wird auf TextRenderingHintSingLeBitPerPixel-festgelegt, und der Textrenderinghinweis des inneren Containers wird auf TextRenderingHintAntiAliasfestgelegt. Der Code zeichnet drei Zeichenfolgen: eine aus dem inneren Container, eine aus dem äußeren Container und eine aus dem Graphics-Objekt selbst.
Graphics graphics(hdc);
GraphicsContainer innerContainer;
GraphicsContainer outerContainer;
SolidBrush brush(Color(255, 0, 0, 255));
FontFamily fontFamily(L"Times New Roman");
Font font(&fontFamily, 36, FontStyleRegular, UnitPixel);
graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
outerContainer = graphics.BeginContainer();
graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel);
innerContainer = graphics.BeginContainer();
graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
graphics.DrawString(L"Inner Container", 15, &font,
PointF(20, 10), &brush);
graphics.EndContainer(innerContainer);
graphics.DrawString(L"Outer Container", 15, &font, PointF(20, 50), &brush);
graphics.EndContainer(outerContainer);
graphics.DrawString(L"Graphics Object", 15, &font, PointF(20, 90), &brush);
Die folgende Abbildung zeigt die drei Zeichenfolgen. Die aus dem inneren Container gezeichneten Zeichenfolgen und das Graphics-Objekt werden durch Antialiasing geglättet. Die aus dem äußeren Container gezeichnete Zeichenfolge wird durch Antialiasing aufgrund der Einstellung "TextRenderingHintSingLeBitPerPixel" nicht geglättet.