İç İçe Grafik Kapsayıcılarını Kullanma
GDI+, bir nesnedeki durumunun geçici olarak yerini almak veya bir kısmını genişletmek için kullanabileceğiniz kapsayıcılar sağlar Graphics . Bir nesnenin yöntemini çağırarak bir kapsayıcı oluşturursunuz BeginContainerGraphics . BeginContainerİç içe geçmiş kapsayıcıları biçimlendirmek için tekrar tekrar çağırabilirsiniz. Her çağrısının BeginContainer öğesine yapılan çağrısıyla eşleştirilmesi gerekir EndContainer .
Iç Içe kapsayıcılardaki dönüşümler
Aşağıdaki örnek, Graphics Bu nesne içinde bir nesne ve bir kapsayıcı oluşturur Graphics . Nesnenin Dünya dönüştürmesi, Graphics y yönünde x Direction ve 80 birimlerindeki çeviri 100 birimleridir. Kapsayıcının dünya dönüşümü, 30 derecelik bir dönüşdir. Kod, çağrıyı DrawRectangle(pen, -60, -30, 120, 60) iki kez yapar. Öğesine yapılan ilk çağrı DrawRectangle kapsayıcının içindedir; diğer bir deyişle, çağrısı, ve çağrıları arasında yapılır BeginContainerEndContainer . İçin yapılan ikinci çağrı, DrawRectangle çağrısından sonra olur 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)
Yukarıdaki kodda, kapsayıcının içinden çizilen dikdörtgen önce kapsayıcının (döndürme) dünya dönüşümüyle, sonra da nesnenin Dünya dönüşümüyle Graphics (çeviri) dönüştürülür. Kapsayıcının dışından çizilen dikdörtgen yalnızca Graphics nesnenin (çeviri) dünya dönüştürmesi tarafından dönüştürülür. Aşağıdaki çizimde iki dikdörtgen gösterilmektedir:

Iç Içe kapsayıcılar içinde kırpma
Aşağıdaki örnek, iç içe geçmiş kapsayıcıların kırpma bölgelerini nasıl işleyeceğini gösterir. Kod, Graphics Bu nesne içinde bir nesne ve bir kapsayıcı oluşturur Graphics . Nesnenin kırpma bölgesi Graphics bir dikdörtgendir ve kapsayıcının kırpma bölgesi bir elips. Kod, yöntemi için iki çağrı yapar DrawLine . ' A yapılan ilk çağrı DrawLine kapsayıcının içindedir ve ikinci çağrısı DrawLine kapsayıcının dışında olur (çağrısından sonra EndContainer ). İlk satır, iki kırpma bölgesinin kesişimine göre kırpılır. İkinci satır yalnızca nesnenin dikdörtgen kırpma bölgesiyle kırpılır 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)
Aşağıdaki çizim, iki kırpılan satırı göstermektedir:

Yukarıdaki iki örnekte gösterildiği gibi, dönüştürmeler ve kırpma bölgeleri iç içe geçmiş kapsayıcılarda birikimli bir örnektir. Kapsayıcının ve nesnenin Dünya dönüştürmelerini ayarlarsanız Graphics , her iki dönüştürme de kapsayıcının içinden çizilen öğelere uygulanır. Kapsayıcının dönüşümü önce uygulanır ve Graphics nesnenin dönüştürmesi ikinci olarak uygulanır. Kapsayıcının ve nesnenin kırpma bölgelerini ayarlarsanız Graphics , kapsayıcının içinden çizilen öğeler, iki kırpma bölgesinin kesişimine göre kırpılacak.
iç içe kapsayıcılar içinde kalite Ayarlar
SmoothingModeTextRenderingHint İç içe kapsayıcılar içindeki kalite ayarları (, ve benzeri) toplu değildir; Bunun yerine kapsayıcının kalite ayarları bir nesnenin kalite ayarlarını geçici olarak değiştirir Graphics . Yeni bir kapsayıcı oluşturduğunuzda, bu kapsayıcının kalite ayarları varsayılan değerlere ayarlanır. Örneğin, Graphics yumuşatma modu olan bir nesneniz olduğunu varsayalım AntiAlias . Bir kapsayıcı oluşturduğunuzda, kapsayıcının içindeki yumuşatma modu varsayılan yumuşatma modudur. Kapsayıcının düzgünleştirme modunu ayarlamanız ücretsizdir ve kapsayıcının içinden çizilen tüm öğeler ayarladığınız moda göre çizilmez. Çağrısından sonra çizilen öğeler, EndContainer çağrısının önüne yerleştirilecek yumuşatma moduna () göre çizilecektir AntiAliasBeginContainer .
Iç Içe geçmiş kapsayıcıların çeşitli katmanları
Bir nesne içindeki bir kapsayıcınıza sınırlı değilsiniz Graphics . Her biri yukarıda iç içe yerleştirilmiş bir kapsayıcı dizisi oluşturabilir ve bu iç içe kapsayıcıların dünya dönüşümünü, kırpma bölgesini ve kalite ayarlarını belirtebilirsiniz. En içteki kapsayıcının içinden bir çizim yöntemi çağırırsanız dönüşümler, en içteki kapsayıcından başlayıp en dıştaki kapsayıcı ile sona ermek üzere sırayla uygulanır. En içteki kapsayıcının içinden çizilen öğeler, tüm kırpma bölümlerinin kesişimine göre kırpılacak.
Aşağıdaki örnek bir nesnesi oluşturur Graphics ve metin işleme ipucunu olarak ayarlar AntiAlias . Kod, diğeri içinde iç içe iki kapsayıcı oluşturur. Dış kapsayıcının metin işleme ipucu olarak ayarlanır SingleBitPerPixel ve iç kapsayıcının metin işleme ipucu olarak ayarlanır AntiAlias . Kod üç dize çizer: biri iç kapsayıcıdan, biri dış kapsayıcıdan, diğeri de Graphics nesnenin kendisidir.
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))
Aşağıdaki çizimde üç dize gösterilmektedir. İç kapsayıcıdan ve nesnesinden çizilen dizeler Graphics düzgünleştirerek düzgünleştirilir. Özellik olarak ayarlandığından, dış kapsayıcıdan çizilen dize düzgünleştirme tarafından düzgünleştirilmez TextRenderingHintSingleBitPerPixel .
