Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
GDI+, bir Graphics nesnesindeki durumun bir bölümünü geçici olarak değiştirmek veya artırmak için kullanabileceğiniz kapsayıcılar sağlar. Bir BeginContainer nesnesinin Graphics yöntemini çağırarak kapsayıcı oluşturursunuz. İç içe kapsayıcılar oluşturmak için BeginContainer art arda çağırabilirsiniz. her BeginContainer çağrısı, EndContainerçağrısıyla eşleştirilmelidir.
İç İçe Kapsayıcılardaki Dönüşümler
Aşağıdaki örnek, bir Graphics nesnesi ve bu Graphics nesnesi içinde bir kapsayıcı oluşturur.
Graphics nesnesinin dünya dönüşümü, x yönünde 100 birim ve y yönünde 80 birim çeviridir. Kapsayıcının dünya dönüşümü 30 derecelik bir döndürmedir. Kod, DrawRectangle(pen, -60, -30, 120, 60) çağrısını iki kez yapar.
DrawRectangle'a ilk çağrı kapsayıcının içindedir; yani çağrı, BeginContainer ve EndContainerçağrıları arasındadır. İkinci DrawRectangle çağrısı, EndContainerçağrısından sonradır.
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 global dönüşümü (dönme) ile ve ardından Graphics nesnesinin global dönüşümü (taşıma) ile dönüştürülür. Kapsayıcının dışından çizilen dikdörtgen, yalnızca Graphics nesnesinin (çeviri) dünya dönüşümüyle dönüştürülür. Aşağıdaki çizimde iki dikdörtgen gösterilmektedir:
İç İçe Kapsayıcılarda Kırpma
Aşağıdaki örnek, iç içe kapsayıcıların kırpma bölgelerini nasıl yönettiğini gösterir. Kod, bir Graphics nesnesi ve bu Graphics nesnesi içinde bir kapsayıcı oluşturur. Graphics nesnesinin kırpma bölgesi bir dikdörtgen, kapsayıcının kırpma bölgesi ise bir elipstir. Kod, DrawLine yöntemine iki çağrı yapar. İlk DrawLine çağrısı kapsayıcının içindedir ve ikinci DrawLine çağrısı kapsayıcının dışındadır (EndContainerçağrısından sonra). İlk satır, iki kırpma bölgesinin kesişme noktasında kırpılır. İkinci çizgi yalnızca Graphics nesnesinin dikdörtgen kırpma bölgesi tarafından kırpılır.
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 çizimde iki kırpılmış çizgi gösterilmektedir:
Önceki iki örnekte gösterildiği gibi, dönüştürmeler ve kırpma bölgeleri iç içe kapsayıcılarda kümülatiftir. Kapsayıcının ve Graphics nesnesinin dünya dönüşümlerini ayarlarsanız, her iki dönüştürme de kapsayıcının içinden çekilen öğelere uygulanır. Kapsayıcının dönüşümü önce uygulanır ve Graphics nesnesinin dönüşümü ikinci kez uygulanır. Kapsayıcının kırpma bölgelerini ve Graphics nesnesini ayarlarsanız, kapsayıcının içinden çekilen öğeler iki kırpma bölgesinin kesişimi tarafından kırpılır.
İç İçe Kapsayıcılarda Kalite Ayarları
İç içe kapsayıcılardaki kalite ayarları (SmoothingMode, TextRenderingHintve benzeri) birikmeli değildir; bunun yerine, kapsayıcının kalite ayarları geçici olarak bir Graphics nesnesinin kalite ayarlarını değiştirir. Yeni bir kapsayıcı oluşturduğunuzda, bu kapsayıcının kalite ayarları varsayılan değerlere ayarlanır. Örneğin, Graphicsdüzeltme moduna sahip bir AntiAlias nesneniz olduğunu varsayalım. Kapsayıcı oluşturduğunuzda, kapsayıcının içindeki düzeltme modu varsayılan düzeltme modudur. Kapsayıcının düzeltme modunu ayarlayabilirsiniz ve kapsayıcının içinden çekilen tüm öğeler ayarladığınız moda göre çizilir. EndContainer çağrısından sonra çizilen öğeler, AntiAliasçağrısından önce yerinde olan düzeltme moduna (BeginContainer) göre çizilir.
İç İçe Kapsayıcıların Birkaç Katmanı
Bir Graphics nesnesinde tek bir kapsayıcıyla sınırlı değilsiniz. Her biri öncekine iç içe geçmiş bir kapsayıcı dizisi oluşturabilir ve bu iç içe kapsayıcıların her birinin dünya dönüşümü, kırpma bölgesi ve kalite ayarlarını belirtebilirsiniz. En içteki kapsayıcının içinden bir çizim fonksiyonu çağırdığınızda, dönüşümler en içteki kapsayıcıdan başlayıp en dıştaki kapsayıcıyla biten sırayla uygulanır. En içteki kapsayıcının içinden çekilen öğeler, tüm kırpma bölgelerinin kesişimiyle kırpılır.
Aşağıdaki örnek bir Graphics nesnesi oluşturur ve metin işleme ipucunu AntiAliasolarak ayarlar. Kod, biri diğerinin içinde iç içe yerleştirilmiş iki kapsayıcı oluşturur. Dış kapsayıcının metin işleme ipucu SingleBitPerPixelolarak, iç kapsayıcının metin işleme ipucu ise AntiAliasolarak ayarlanır. Kod üç dize çizer: biri iç kapsayıcıdan, biri dış kapsayıcıdan ve biri de Graphics nesnesinin kendisinden.
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 Graphics nesnesinden çekilen dizeler, antialiasing ile düzeltilir. dış kapsayıcıdan çekilen dize, TextRenderingHint özelliği SingleBitPerPixelolarak ayarlandığından, antialiasing tarafından düzeltilmemiştir.
Ayrıca bakınız
.NET Desktop feedback