Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
GDI+ innehåller containrar som du kan använda för att tillfälligt ersätta eller utöka en del av tillståndet i ett Graphics objekt. Du skapar en container genom att anropa metoden för BeginContainer ett Graphics objekt. Du kan anropa BeginContainer flera gånger för att skapa kapslade containrar. Varje anrop till BeginContainer måste paras ihop med ett anrop till EndContainer.
Transformeringar i kapslade containrar
I följande exempel skapas ett Graphics objekt och en container i objektet Graphics . Världsomvandlingen Graphics av objektet är en översättning på 100 enheter i x-riktningen och 80 enheter i y-riktningen. Världsomvandlingen av containern är en 30-graders rotation. Koden gör anropet DrawRectangle(pen, -60, -30, 120, 60) två gånger. Det första anropet till DrawRectangle finns i containern, det vill säga anropet är mellan anropen till BeginContainer och EndContainer. Det andra anropet till DrawRectangle är efter anropet till EndContainer.
Graphics graphics = e.Graphics;
Pen pen = new Pen(Color.Red);
GraphicsContainer graphicsContainer;
graphics.FillRectangle(Brushes.Black, 100, 80, 3, 3);
graphics.TranslateTransform(100, 80);
graphicsContainer = graphics.BeginContainer();
graphics.RotateTransform(30);
graphics.DrawRectangle(pen, -60, -30, 120, 60);
graphics.EndContainer(graphicsContainer);
graphics.DrawRectangle(pen, -60, -30, 120, 60);
Dim graphics As Graphics = e.Graphics
Dim pen As New Pen(Color.Red)
Dim graphicsContainer As GraphicsContainer
graphics.FillRectangle(Brushes.Black, 100, 80, 3, 3)
graphics.TranslateTransform(100, 80)
graphicsContainer = graphics.BeginContainer()
graphics.RotateTransform(30)
graphics.DrawRectangle(pen, -60, -30, 120, 60)
graphics.EndContainer(graphicsContainer)
graphics.DrawRectangle(pen, -60, -30, 120, 60)
I föregående kod transformeras rektangeln som hämtas inifrån containern först av världsomvandlingen av containern (rotation) och sedan av objektets Graphics världsomvandling (översättning). Rektangeln som ritats utifrån containern omvandlas endast av Graphics-objektets världstransformation (translation). Följande bild visar de två rektanglarna:
Urklipp i kapslade containrar
I följande exempel visas hur kapslade containrar hanterar klippområden. Koden skapar ett Graphics objekt och en container i objektet Graphics . Urklippsregionen för Graphics objektet är en rektangel och urklippsregionen i containern är en ellips. Koden gör två anrop till DrawLine metoden. Det första anropet till DrawLine finns i containern och det andra anropet till DrawLine är utanför containern (efter anropet till EndContainer). Den första raden klipps av genom skärningspunkten mellan de två urklippsregionerna. Den andra raden klipps bara av objektets rektangulära urklippsregion Graphics .
Graphics graphics = e.Graphics;
GraphicsContainer graphicsContainer;
Pen redPen = new Pen(Color.Red, 2);
Pen bluePen = new Pen(Color.Blue, 2);
SolidBrush aquaBrush = new SolidBrush(Color.FromArgb(255, 180, 255, 255));
SolidBrush greenBrush = new SolidBrush(Color.FromArgb(255, 150, 250, 130));
graphics.SetClip(new Rectangle(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 = new GraphicsPath();
path.AddEllipse(75, 50, 100, 150);
// Construct a region based on the path.
Region region = new Region(path);
graphics.FillRegion(greenBrush, region);
graphics.SetClip(region, CombineMode.Replace);
graphics.DrawLine(redPen, 50, 0, 350, 300);
graphics.EndContainer(graphicsContainer);
graphics.DrawLine(bluePen, 70, 0, 370, 300);
Dim graphics As Graphics = e.Graphics
Dim graphicsContainer As GraphicsContainer
Dim redPen As New Pen(Color.Red, 2)
Dim bluePen As New Pen(Color.Blue, 2)
Dim aquaBrush As New SolidBrush(Color.FromArgb(255, 180, 255, 255))
Dim greenBrush As New SolidBrush(Color.FromArgb(255, 150, 250, 130))
graphics.SetClip(New Rectangle(50, 65, 150, 120))
graphics.FillRectangle(aquaBrush, 50, 65, 150, 120)
graphicsContainer = graphics.BeginContainer()
' Create a path that consists of a single ellipse.
Dim path As New GraphicsPath()
path.AddEllipse(75, 50, 100, 150)
' Construct a region based on the path.
Dim [region] As New [Region](path)
graphics.FillRegion(greenBrush, [region])
graphics.SetClip([region], CombineMode.Replace)
graphics.DrawLine(redPen, 50, 0, 350, 300)
graphics.EndContainer(graphicsContainer)
graphics.DrawLine(bluePen, 70, 0, 370, 300)
Följande bild visar de två klippta linjerna:
Som de två föregående exemplen visar är transformeringar och urklippsregioner kumulativa i kapslade containrar. Om du anger världsomvandlingarna för containern och Graphics objektet gäller båda transformeringarna för objekt som hämtas inifrån containern. Transformationen av containern kommer att tillämpas först, och transformationen av Graphics objektet kommer att tillämpas därefter. Om du ställer in urklippsregionerna för containern och Graphics-objektet kommer objekt som hämtas inifrån containern att klippas av skärningspunkten mellan de två urklippsregionerna.
Kvalitetsinställningar i kapslade containrar
Kvalitetsinställningar (SmoothingMode, TextRenderingHintoch liknande) i kapslade containrar är inte kumulativa. I stället ersätter containerns kvalitetsinställningar tillfälligt kvalitetsinställningarna för ett Graphics objekt. När du skapar en ny container är kvalitetsinställningarna för containern inställda på standardvärden. Anta till exempel att du har ett Graphics objekt med utjämningsläget AntiAlias. När du skapar en container är utjämningsläget i containern standardutjämningsläget. Du kan ställa in utjämningsläget för containern, och alla objekt som hämtas inifrån containern ritas enligt det läge du anger. Objekt som ritats efter anropet till EndContainer ritas enligt det utjämningsläge (AntiAlias) som var på plats före anropet till BeginContainer.
Flera lager med kapslade containrar
Du är inte begränsad till en container i ett Graphics objekt. Du kan skapa en sekvens med containrar, var och en kapslad i föregående, och du kan ange världsomvandling, urklippsregion och kvalitetsinställningar för var och en av dessa kapslade containrar. Om du anropar en ritningsmetod inifrån den innersta containern tillämpas transformeringarna i ordning, från och med den innersta containern och slutar med den yttersta containern. Objekt som hämtas inifrån den innersta containern klipps av genom skärningspunkten för alla urklippsregioner.
I följande exempel skapas ett Graphics objekt och dess textåtergivningstips anges till AntiAlias. Koden skapar två containrar, en kapslad i den andra. Textåtergivningstipset för den yttre containern är inställt på SingleBitPerPixel, och textåtergivningstipset för den inre containern är inställt på AntiAlias. Koden ritar tre strängar: en från den inre containern, en från den yttre containern och en från Graphics själva objektet.
Graphics graphics = e.Graphics;
GraphicsContainer innerContainer;
GraphicsContainer outerContainer;
SolidBrush brush = new SolidBrush(Color.Blue);
FontFamily fontFamily = new FontFamily("Times New Roman");
Font font = new Font(fontFamily, 36, FontStyle.Regular, GraphicsUnit.Pixel);
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
outerContainer = graphics.BeginContainer();
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;
innerContainer = graphics.BeginContainer();
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
graphics.DrawString(
"Inner Container",
font,
brush,
new PointF(20, 10));
graphics.EndContainer(innerContainer);
graphics.DrawString(
"Outer Container",
font,
brush,
new PointF(20, 50));
graphics.EndContainer(outerContainer);
graphics.DrawString(
"Graphics Object",
font,
brush,
new PointF(20, 90));
Dim graphics As Graphics = e.Graphics
Dim innerContainer As GraphicsContainer
Dim outerContainer As GraphicsContainer
Dim brush As New SolidBrush(Color.Blue)
Dim fontFamily As New FontFamily("Times New Roman")
Dim font As New Font( _
fontFamily, _
36, _
FontStyle.Regular, _
GraphicsUnit.Pixel)
graphics.TextRenderingHint = _
System.Drawing.Text.TextRenderingHint.AntiAlias
outerContainer = graphics.BeginContainer()
graphics.TextRenderingHint = _
System.Drawing.Text.TextRenderingHint.SingleBitPerPixel
innerContainer = graphics.BeginContainer()
graphics.TextRenderingHint = _
System.Drawing.Text.TextRenderingHint.AntiAlias
graphics.DrawString( _
"Inner Container", _
font, _
brush, _
New PointF(20, 10))
graphics.EndContainer(innerContainer)
graphics.DrawString("Outer Container", font, brush, New PointF(20, 50))
graphics.EndContainer(outerContainer)
graphics.DrawString("Graphics Object", font, brush, New PointF(20, 90))
Följande bild visar de tre strängarna. Strängarna som hämtas från den inre containern och från Graphics objektet jämnas ut med antialias. Strängen som hämtas från den yttre containern jämnas inte ut med antialias eftersom TextRenderingHint egenskapen är inställd på SingleBitPerPixel.
Se även
.NET Desktop feedback