Compartilhar via


O uso de contêineres aninhados de gráficos

GDI+fornece os recipientes que você pode usar para substituir ou aumentar a parte do estado em temporariamente um Graphics objeto. Você cria um contêiner chamando o BeginContainer o método de um Graphics objeto. Você pode chamar BeginContainer repetidamente para formar recipientes aninhados. Cada chamada para BeginContainer deve estar combinada com uma chamada para EndContainer.

Transformações nos recipientes aninhados

O exemplo a seguir cria um Graphics objeto e um recipiente dentro do que Graphics objeto. A transformação do mundo da Graphics objeto é uma tradução de 100 unidades na x direção e 80 unidades o y direção. A transformação do mundo do contêiner é uma rotação de 30 graus. O código faz a chamada DrawRectangle(pen, -60, -30, 120, 60) duas vezes. A primeira chamada para DrawRectangle está dentro do contêiner; ou seja, a chamada é entre as chamadas para BeginContainer e EndContainer. A segunda chamada para DrawRectangle após a chamada 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 desenhado de dentro do contêiner é transformado primeiro pela transformação mundo do contêiner (rotação) e pela transformação do mundo, em seguida, o Graphics (conversão) do objeto. O retângulo desenhado de fora do contêiner é transformado apenas pela transformação do mundo a Graphics (conversão) do objeto. A ilustração a seguir mostra os dois retângulos.

Contêineres aninhados

Corte em recipientes aninhados

O exemplo a seguir demonstra como aninhadas recipientes manipular regiões de recorte. O código cria um Graphics objeto e um recipiente dentro do 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 chamada para DrawLine está dentro do contêiner e a segunda chamada para DrawLine está fora do contêiner (após a chamada para EndContainer). A primeira linha será cortada pela interseção das regiões de recorte de dois. A segunda linha é cortada apenas por região de corte retangular da 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.

Contêiner aninhado

Como mostram a dois exemplos anteriores, transformações e regiões de recorte são cumulativos em recipientes aninhados. Se você definir as transformações do mundo do recipiente e o Graphics o objeto, as duas transformações serão aplicada a itens tiradas de dentro do contêiner. A transformação do recipiente será aplicado primeiro e a transformação da Graphics objeto será aplicado segundo. Se você definir regiões de recorte do recipiente e o Graphics o objeto, tiradas de dentro do contêiner de itens serão cortados pela interseção de regiões de recorte de dois.

Configurações de qualidade em recipientes aninhados

Configurações de qualidade (SmoothingMode, TextRenderingHinte assim por diante) em recipientes aninhados não são cumulativas; em vez disso, as configurações de qualidade do recipiente substituem temporariamente as configurações de qualidade de um Graphics objeto. Quando você cria um novo recipiente, as configurações de qualidade para o recipiente são definidas para valores padrão. Por exemplo, suponha que você tenha um Graphics o objeto com um modo de suavização de AntiAlias. Quando você cria um recipiente, o modo de suavização dentro do contêiner é o padrão de modo de suavização. Você está livre para definir o modo de suavização do contêiner e quaisquer itens tiradas de dentro do contêiner serão desenhados de acordo com ao modo definido por você. Itens desenhadas depois da chamada para EndContainer serão desenhados de acordo com para o modo de suavização (AntiAlias) que estava em vigor antes da chamada para BeginContainer.

Várias camadas de recipientes aninhados

Você não está limitado a um contêiner em um Graphics objeto. Você pode criar uma seqüência de recipientes, cada aninhado no anterior e você pode especificar a transformação do mundo, a região de recorte e as configurações de qualidade de cada um desses recipientes aninhados. Se você chamar um método de desenho de dentro do contêiner 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. Obtido 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 de objeto e define sua dica de processamento de texto para AntiAlias. O código cria dois recipientes, uma aninhada dentro de outro. A dica de processamento de texto do recipiente externa é definida como SingleBitPerPixel, e a dica de processamento de texto do recipiente interno é definida como AntiAlias. O código desenha três seqüências de caracteres: entre no recipiente interno, aquele do contêiner externo e da Graphics próprio objeto.

        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 recipiente interno e a partir de Graphics objeto são suavizadas por suavização. A seqüência de caracteres obtida o contêiner externo não é suavizada por suavização porque a TextRenderingHint for definida como SingleBitPerPixel.

Contêineres aninhados

Consulte também

Referência

Graphics

Conceitos

Gerenciar o estado de um objeto Graphics