Usando Containers Graphics aninhados
GDI+ fornece contêineres que podem ser usados para substituir temporariamente ou ampliar a parte do estado em um Graphics objeto. Você criar um contêiner chamando o BeginContainer método de um Graphics objeto. Você pode chamar BeginContainer várias vezes para formar recipientes aninhados. Cada telefonar para BeginContainer deve estar combinado com uma telefonar para EndContainer.
Transformações nos contêineres aninhados
O exemplo a seguir cria um Graphics objeto e um contêiner em que Graphics objeto. transformação global do Graphics objeto é uma tradução 100 unidades na x direção e 80 unidades do y direção. transformação global do contêiner é uma rotação de 30 graus.O código torna a telefonar DrawRectangle(pen, -60, -30, 120, 60) duas vezes. A primeira telefonar para DrawRectangle está contido no contêiner; ou seja, a telefonar é entre as chamadas para BeginContainer e EndContainer. A segunda telefonar para DrawRectangle Após a telefonar para EndContainer.
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)
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);
No código anterior, o retângulo tirado de dentro do contêiner é transformado pela primeira vez, transformação global do contêiner (rotação) e em seguida, transformação global do Graphics objeto (conversão). O retângulo tirado de fora o contêiner é transformado apenas pela transformação mundo do Graphics objeto (conversão). A ilustração a seguir mostra os dois retângulos.
Recorte em contêineres aninhados
O exemplo a seguir demonstra como recipientes aninhadas como lidar com regiões de recorte.O código cria um Graphics objeto e um contêiner em que Graphics objeto. A região de recorte do Graphics o objeto é um retângulo, e a região de recorte do contêiner é uma elipse. O código faz duas chamadas para o DrawLine método. A primeira telefonar para DrawLine está contido o contêiner e a segunda telefonar para DrawLine está fora o recipiente (após a telefonar para EndContainer). A primeira linha será cortada pela interseção das regiões de dois recorte.A segunda linha é cortada somente por região de corte retangular do Graphics objeto.
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)
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);
A ilustração a seguir mostra as duas linhas cortadas.
sistema autônomo mostram dois exemplos anteriores, transformações e regiões de recorte são cumulativas em recipientes aninhados.Se você conjunto as transformações do mundo de contêiner e o Graphics objeto, as duas transformações serão aplicada a itens tiradas de dentro do contêiner. A transformação do contêiner será aplicado primeiro e a transformação do Graphics objeto será aplicado em segundo lugar. Se você conjunto regiões de recorte do contêiner e o Graphics objeto, tiradas de dentro do contêiner de itens será cortado pela interseção das regiões de dois recorte.
Configurações de qualidade no Containers aninhados
Configurações de qualidade (SmoothingMode, TextRenderingHinte assim por diante) em recipientes aninhadas não são cumulativas; em vez disso, as configurações de qualidade do contêiner substituem temporariamente as configurações de qualidade de um Graphics objeto. Quando você criar um novo contêiner, as configurações de qualidade para esse contêiner são definidas para valores padrão.Por exemplo, suponha que você possui um Graphics objeto com um modo de suavização AntiAlias. Quando você cria um recipiente, o modo de suavização dentro do contêiner é o padrão modo de suavização.Você é disponível para conjunto o modo de suavização do contêiner e todos os itens tirados de dentro do contêiner serão desenhados de acordo com ao modo definido por você.Itens desenhadas depois da telefonar para EndContainer serão desenhados de acordo com para o (modo de suavizaçãoAntiAlias) que se encontrava antes da telefonar para BeginContainer.
Várias camadas de contêineres aninhados
Você não está limitado a um contêiner de um Graphics objeto. Você pode criar uma sequência de recipientes, cada aninhado no anterior e você pode especificar transformação global, região de recorte e as configurações de qualidade de cada um desses recipientes aninhados.Se você telefonar um método de desenho de dentro do recipiente de mais interno, as transformações serão aplicadas na ordem, começando com o contêiner mais interno e terminando com o recipiente mais externo.Tiradas de dentro do contêiner mais interno de itens serão cortados pela interseção de todas as regiões de recorte.
O exemplo a seguir cria um Graphics objeto e seu renderização de texto Dica para conjuntos AntiAlias. O código cria dois recipientes, uma aninhada em Outros.A dica de renderização de texto do contêiner externa é conjunto para SingleBitPerPixel, e a dica de renderização de texto do contêiner interno é conjunto para AntiAlias. O código desenha três cadeias de caracteres: entre no recipiente interno, um contêiner externo e um a partir de Graphics objeto propriamente dito.
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))
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));
A ilustração a seguir mostra três cadeias de caracteres.As seqüências de caracteres desenhadas do contêiner interno e do Graphics objeto são suavizadas por suavização. A seqüência de caracteres extraída do contêiner externo não suavizada por suavização porque o TextRenderingHint propriedade estiver definida como SingleBitPerPixel.
Consulte também
Conceitos
Gerenciamento de estado de um objeto Graphics