Megosztás a következőn keresztül:


Beágyazott grafikus tárolók használata

A GDI+ olyan tárolókat biztosít, amelyekkel ideiglenesen lecserélheti vagy kiegészítheti az állapot egy részét egy Graphics objektumban. Tárolót egy BeginContainer objektum Graphics metódusának meghívásával hozhat létre. A BeginContainer többször is meghívhatja beágyazott tárolók létrehozásához. Az BeginContainer hívását párosítani kell egy EndContainerhívással.

Átalakítások beágyazott tárolókban

Az alábbi példa létrehoz egy Graphics objektumot és egy tárolót az adott Graphics objektumon belül. A Graphics objektum világátalakítása 100 egység fordítása x irányban és 80 egység y irányban. A konténer világtranszformációja 30 fokos forgatás. A kód kétszer kezdeményezi a DrawRectangle(pen, -60, -30, 120, 60) hívást. A DrawRectangle első hívása a tárolóban történik; vagyis a hívás a BeginContainer és a EndContainerhívások között található. A DrawRectangle második hívása a EndContainerhívása után történik.

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)

Az előző kódban a tárolón belülről rajzolt téglalapot először a tároló világtranszformációja (forgatás) alakítja át, majd a Graphics objektum világtranszformációja (eltolás). A tárolón kívülről rajzolt téglalapot csak a Graphics objektum (fordítás) világátalakítása alakítja át. Az alábbi ábrán a két téglalap látható:

Beágyazott tárolókat bemutató ábra.

Kivágás beágyazott tárolókban

Az alábbi példa bemutatja, hogyan kezelik a beágyazott tárolók a kivágási régiókat. A kód létrehoz egy Graphics objektumot és egy tárolót az adott Graphics objektumon belül. A Graphics objektum kivágási területe téglalap, a tároló kivágási területe pedig ellipszis. A kód két hívást indít a DrawLine metódushoz. A DrawLine első hívása a tárolón belül van, a második pedig a DrawLine hívása a tárolón kívül (a EndContainerhívása után). Az első sort a két kivágási régió metszete vágja ki. Csak a Graphics objektum téglalap alakú kivágási régiója vágja le a második sort.

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)

Az alábbi ábrán a két levágott vonal látható:

Beágyazott tárolót ábrázoló ábra levágott vonalakkal.

Ahogy az előző két példa is mutatja, az átalakítások és a kivágási régiók beágyazott konténerekben összegződnek. Ha beállítja a tároló és a Graphics objektum világátalakításait, mindkét átalakítás a tárolón belülről származó elemekre lesz alkalmazva. Először a tároló átalakítása lesz alkalmazva, a Graphics objektum átalakítása pedig a második. Ha beállítja a tároló és a Graphics objektum kivágási régióit, akkor a tárolón belülről származó elemeket a két kivágási régió metszete fogja levágni.

Minőségi beállítások beágyazott tárolókban

A beágyazott tárolók minőségi beállításai (SmoothingMode, TextRenderingHintés hasonlók) nem halmozódnak fel; ehelyett a tároló minőségi beállításai ideiglenesen lecserélik egy Graphics objektum minőségi beállításait. Új tároló létrehozásakor a tároló minőségi beállításai alapértelmezett értékekre vannak állítva. Tegyük fel például, hogy van egy Graphics objektum, amelynek AntiAliassimító módja van. Tároló létrehozásakor a tárolón belüli simítási mód az alapértelmezett simítási mód. Szabadon beállíthatja a tároló simítási módját, és a tárolón belülről kirajzolt elemek a beállított módnak megfelelően lesznek rajzolva. A EndContainer hívása után rajzolt elemeket a simítási mód (AntiAlias) szerint rajzoljuk ki, amely a BeginContainerhívása előtt volt.

Beágyazott tárolók több rétege

Egy Graphics objektumban nem csak egy tárolót használhat. Létrehozhat egy tárolók sorozatát, amelyek mindegyike az előzőekben van beágyazva, és megadhatja az egyes beágyazott tárolók világátalakítását, kivágási régióját és minőségi beállításait. Ha egy rajzmetódust a legbelső tárolóból hív meg, az átalakítások sorrendben lesznek alkalmazva, kezdve a legbelső tárolóval, és a legkülső tárolóval végződnek. A legbelső tárolóból kihúzott elemeket az összes kivágási régió metszete vágja ki.

Az alábbi példa létrehoz egy Graphics objektumot, és a szövegmegjelenítési tippet AntiAliasértékre állítja. A kód két tárolót hoz létre, az egyik beágyazott a másikba. A külső tároló szövegmegjelenítési tippje SingleBitPerPixel, a belső tároló szövegmegjelenítési tippje pedig AntiAlias. A kód három karakterláncot rajzol: egyet a belső tárolóból, egyet a külső tárolóból, és egyet magából a Graphics objektumból.

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

Az alábbi ábra a három karakterláncot mutatja. A belső tárolóból és a Graphics objektumból származó húrokat az antialiasing simítja meg. A külső tárolóból kirajzolt karakterláncot nem simítja az antialiasing, mert a TextRenderingHint tulajdonság értéke SingleBitPerPixel.

Egy ábra, amely a beágyazott tárolókból húzott sztringeket mutatja.

Lásd még