Geschachtelte Grafikcontainer
Windows GDI+ container, mit denen Sie einen Teil des Zustands in einem Graphics-Objekt vorübergehend ersetzen oder vergrößern können. 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 werden ein Graphics-Objekt und ein Container in diesem Graphics-Objekt erstellt. Die Welttransformation des Grafikobjekts ist eine Übersetzung von 100 Einheiten in x-Richtung und 80 Einheiten in y-Richtung. Die Welttransformation des Containers ist eine Drehung um 30 Grad. Der Code gibt den Aufruf aus.
DrawRectangle(&pen, -60, -30, 120, 60)
Zweimal. Der erste Aufruf von Graphics::D rawRectangle befindet sich im Container. Das bedeutet, dass sich der Aufruf zwischen den Aufrufen von Graphics::BeginContainer und Graphics::EndContainer befindet. Der zweite Aufruf von Graphics::D rawRectangle ist 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 vorangehenden Code wird das aus dem Container gezeichnete Rechteck zuerst durch die Welttransformation des Containers (Drehung) und dann durch die Welttransformation des Grafikobjekts (Übersetzung) transformiert. Das von außerhalb des Containers gezeichnete Rechteck wird nur durch die Welttransformation des Grafikobjekts (Übersetzung) transformiert. Die folgende Abbildung zeigt die beiden Rechtecke.

Clipping in geschachtelten Containern
Im folgenden Beispiel wird veranschaulicht, wie geschachtelte Container Clippingregionen behandeln. Der Code erstellt ein Graphics-Objekt und einen Container innerhalb dieses Graphics-Objekts. Der Ausschneidebereich des Grafikobjekts ist ein Rechteck, und der Ausschneidebereich des Containers ist eine Ellipse. Der Code ruft die Graphics::D rawLine-Methode auf. Der erste Aufruf von Graphics::D rawLine befindet sich im Container, 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 Ausschneideregionen abgeschnitten. Die zweite Zeile wird nur durch den rechteckigen Ausschneidebereich 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 abgeschnittenen Linien.

Wie die beiden obigen Beispiele zeigen, sind Transformationen und Beschneidungsregionen in geschachtelten Containern kumulativ. Wenn Sie die Welttransformationen des Containers und des Grafikobjekts festlegen, gelten beide Transformationen für Elemente, die aus dem Container gezeichnet werden. Die Transformation des Containers wird zuerst angewendet, und die Transformation des Graphics-Objekts wird als Zweites angewendet. Wenn Sie die Ausschneideregionen des Containers und des Grafikobjekts festlegen, werden aus dem Container gezeichnete Elemente durch die Schnittmenge der beiden Ausschneideregionen abgeschnitten.
Quality Einstellungen in geschachtelten Containern
Qualitätseinstellungen ( SmoothingMode, TextRenderingHintund deren Like) in geschachtelten Containern sind nicht kumulativ. stattdessen ersetzen die Qualitätseinstellungen des Containers vorübergehend die Qualitätseinstellungen eines Grafikobjekts. Wenn Sie einen neuen Container erstellen, werden die Qualitätseinstellungen für diesen Container auf Standardwerte festgelegt. Angenommen, Sie verfügen über ein Graphics-Objekt mit dem Glättungsmodus "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 gezeichnet werden, werden entsprechend dem von Ihnen festgelegten Modus gezeichnet. Elemente, die nach dem Aufruf von Graphics::EndContainer gezeichnet werden, werden entsprechend dem Glättungsmodus ("SmoothingModeAntiAlias!")gezeichnet, der vor dem Aufruf von Graphics::BeginContainerverwendet wurde.
Mehrere Ebenen geschachtelter Container
Sie sind nicht auf einen Container in einem Graphics-Objekt beschränkt. Sie können eine Sequenz von Containern erstellen, die jeweils im vorherigen Geschachtelt sind, und Sie können die Welttransformation, den Beschneidungsbereich und die Qualitätseinstellungen jedes dieser geschachtelten Container angeben. Wenn Sie eine Zeichnungsmethode innerhalb des innersten Containers aufrufen, werden die Transformationen in der Reihenfolge angewendet, beginnend mit dem innersten Container und dem äußersten Container. Elemente, die aus dem innersten Container gezeichnet werden, werden durch die Schnittmenge aller Ausschneideregionen abgeschnitten.
Im folgenden Beispiel wird ein Graphics-Objekt erstellt und dessen Textrenderinghinweis auf "TextRenderingHintAntiAlias". Der Code erstellt zwei Container, einen innerhalb des anderen geschachtelt. Der Textrenderinghinweis des äußeren Containers ist auf "TextRenderingHintSingleBitPerPixel",und der Textrenderinghinweis des inneren Containers ist auf "TextRenderingHintAntiAlias"festgelegt. 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 und dem Graphics-Objekt gezeichneten Zeichenfolgen werden durch Antialiasing geglättet. Die aus dem äußeren Container gezeichnete Zeichenfolge wird aufgrund der Einstellung TextRenderingHintSingleBitPerPixel nicht durch Antialiasing geglättet.
