Delen via


Geneste grafische containers

Windows GDI+ biedt containers waarmee u tijdelijk een deel van de status in een Graphics-object kunt vervangen of uitbreiden. U maakt een container door de methode Graphics::BeginContainer van een Graphics-object aan te roepen. U kunt Graphics::BeginContainer herhaaldelijk aanroepen om geneste containers te vormen.

Transformaties in geneste containers

In het volgende voorbeeld wordt een Graphics-object en een container in dat Graphics-object gemaakt. De wereldtransformatie van het Graphics object is een vertaling van 100 eenheden in de x-richting en 80 eenheden in de y-richting. De wereldtransformatie van de container is een draaiing van 30 graden. De code roept de aanroep uit

DrawRectangle(&pen, -60, -30, 120, 60)

tweemaal. De eerste aanroep van Graphics::D rawRectangle wordt in de container; Dat wil gezegd: de aanroep bevindt zich tussen de aanroepen naar Graphics::BeginContainer en Graphics::EndContainer. De tweede aanroep van Graphics::D rawRectangle is na de aanroep naar 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);

In de voorgaande code wordt de rechthoek die vanuit de container is getekend, eerst getransformeerd door de wereldtransformatie van de container (rotatie) en vervolgens door de wereldtransformatie van het Graphics-object (vertaling). De rechthoek die van buiten de container is getekend, wordt alleen getransformeerd door de wereldtransformatie van het Graphics-object (vertaling). In de volgende afbeelding ziet u de twee rechthoeken.

schermafbeelding van een venster met twee rode rechthoeken gecentreerd op hetzelfde punt, maar met verschillende draaiingen

 

Knippen in geneste containers

In het volgende voorbeeld ziet u hoe geneste containers knipregio's verwerken. De code maakt een Graphics-object en een container binnen dat Graphics-object. Het knipgebied van het Graphics-object is een rechthoek en het knipgebied van de container is een beletselteken. De code roept twee aanroepen uit naar de methode Graphics::D rawLine. De eerste aanroep van Graphics::D rawLine bevindt zich in de container en de tweede aanroep van Graphics::D rawLine bevindt zich buiten de container (na de aanroep naar Graphics::EndContainer). De eerste regel wordt afgekapt door het snijpunt van de twee knipregio's. De tweede regel wordt alleen geknipt door het rechthoekige knipgebied van het Graphics-object.

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, &region);

   graphics.SetClip(&region);
   graphics.DrawLine(&redPen, 50, 0, 350, 300);
graphics.EndContainer(graphicsContainer);

graphics.DrawLine(&bluePen, 70, 0, 370, 300);

In de volgende afbeelding ziet u de twee geknipte lijnen.

illustratie van een beletselteken in een rechthoek, met één lijn die is geknipt door het beletselteken en de andere door de rechthoek

Zoals in de twee voorgaande voorbeelden wordt weergegeven, zijn transformaties en knipregio's cumulatief in geneste containers. Als u de wereldtransformaties van de container en het Graphics-object instelt, worden beide transformaties toegepast op items die vanuit de container zijn getekend. De transformatie van de container wordt eerst toegepast en de transformatie van het Graphics-object wordt vervolgens toegepast. Als u de knipregio's van de container en het Graphics-object instelt, worden items uit de container geknipt door het snijpunt van de twee knipregio's.

Kwaliteitsinstellingen in geneste containers

Kwaliteitsinstellingen (SmoothingMode, TextRenderingHinten dergelijke) in geneste containers zijn niet cumulatief; in plaats daarvan vervangen de kwaliteitsinstellingen van de container tijdelijk de kwaliteitsinstellingen van een Graphics-object. Wanneer u een nieuwe container maakt, worden de kwaliteitsinstellingen voor die container ingesteld op standaardwaarden. Stel dat u een Graphics-object hebt met een vloeiende modus van SmoothingModeAntiAlias-. Wanneer u een container maakt, is de vloeiende modus in de container de standaard vloeiende modus. U kunt de vloeiende modus van de container instellen en alle items die vanuit de container zijn getekend, worden getekend volgens de modus die u instelt. Items die zijn getekend na de aanroep van Graphics::EndContainer worden getekend volgens de vloeiende modus (SmoothingModeAntiAlias) die aanwezig waren vóór de aanroep naar Graphics::BeginContainer.

Verschillende lagen van geneste containers

U bent niet beperkt tot één container in een Graphics-object. U kunt een reeks containers maken, elk genest in het voorgaande, en u kunt de wereldtransformatie, het knipgebied en de kwaliteitsinstellingen van elk van deze geneste containers opgeven. Als u een tekenmethode aanroept vanuit de binnenste container, worden de transformaties op volgorde toegepast, beginnend met de binnenste container en eindigend met de buitenste container. Items die uit de binnenste container worden getrokken, worden afgekapt door het snijpunt van alle knipregio's.

In het volgende voorbeeld wordt een Graphics-object gemaakt en wordt de hint voor tekstweergave ingesteld op TextRenderingHintAntiAlias. De code maakt twee containers, één geneste binnen de andere. De hint voor tekstweergave van de buitenste container is ingesteld op TextRenderingHintSingleBitPer Pixelen de hint voor tekstweergave van de binnenste container is ingesteld op TextRenderingHintAntiAlias. De code tekent drie tekenreeksen: één uit de binnenste container, één uit de buitenste container en één uit de Graphics object zelf.

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);

In de volgende afbeelding ziet u de drie tekenreeksen. De tekenreeksen die zijn getekend uit de binnenste container en het Graphics-object worden gladgestreken door antialiasing. De tekenreeks die uit de buitenste container is getrokken, wordt niet afgevlakt door antialiasing vanwege de instelling TextRenderingHintSingleBitPer Pixel.

afbeelding van een rechthoek die dezelfde tekenreeks bevat; alleen de tekens in de eerste en laatste regels zijn vloeiend