Compartilhar via


O estado de um objeto de elementos gráficos

A classe Graphics está no centro do Windows GDI+. Para desenhar qualquer coisa, você cria um objeto Graphics , define suas propriedades e chama seus métodos ( DrawLine, DrawImage, DrawString e similares).

O exemplo a seguir constrói um objeto Graphics e um objeto Pen e, em seguida, chama o método Graphics::D rawRectangle do objeto Graphics :

HDC          hdc;
PAINTSTRUCT  ps;

hdc = BeginPaint(hWnd, &ps);
{
   Graphics graphics(hdc);
   Pen pen(Color(255, 0, 0, 255));  // opaque blue
   graphics.DrawRectangle(&pen, 10, 10, 200, 100);
}
EndPaint(hWnd, &ps);

No código anterior, o método BeginPaint retorna um identificador para um contexto de dispositivo e esse identificador é passado para o construtor Graphics . Um contexto de dispositivo é uma estrutura (mantida pelo Windows) que contém informações sobre o dispositivo de exibição específico que está sendo usado.

Estado gráfico

Um objeto Graphics faz mais do que fornecer métodos de desenho, como DrawLine e DrawRectangle. Um objeto Graphics também mantém o estado gráfico, que pode ser dividido nas seguintes categorias:

  • Um link para um contexto de dispositivo
  • Configurações de qualidade
  • Transformações
  • Uma região de recorte

Contexto do dispositivo

Como programador de aplicativos, você não precisa pensar na interação entre um objeto Graphics e seu contexto de dispositivo. Essa interação é tratada pelo GDI+ nos bastidores.

Configurações de Qualidade

Um objeto Graphics tem várias propriedades que influenciam a qualidade dos itens desenhados na tela. Você pode exibir e manipular essas propriedades chamando métodos get e set. Por exemplo, você pode chamar o método Graphics::SetTextRenderingHint para especificar o tipo de suavização (se houver) aplicado ao texto. Outros métodos de conjunto que influenciam a qualidade são Graphics::SetSmoothingMode, Graphics::SetCompositingMode, Graphics::SetCompositingQuality e Graphics::SetInterpolationMode.

O exemplo a seguir desenha duas reticências, uma com o modo de suavização definido como SmoothingModeAntiAlias e outra com o modo de suavização definido como SmoothingModeHighSpeed:

Graphics graphics(hdc);
Pen pen(Color(255, 0, 255, 0));  // opaque green

graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.DrawEllipse(&pen, 0, 0, 200, 100);
graphics.SetSmoothingMode(SmoothingModeHighSpeed);
graphics.DrawEllipse(&pen, 0, 150, 200, 100);

Transformações

Um objeto Graphics mantém duas transformações (mundo e página) que são aplicadas a todos os itens desenhados por esse objeto Graphics . Qualquer transformação afim pode ser armazenada na transformação global. Transformações afins incluem colocação em escala, rotação, reflexão, distorção e translação. A transformação de página pode ser usada para colocação em escala e para alterar unidades (por exemplo, pixels em polegadas). Para obter mais informações sobre transformações, consulte Sistemas de coordenadas e transformações.

O exemplo a seguir define o mundo e as transformações de página de um objeto Graphics . A transformação global é definida com uma rotação de 30 graus. A transformação de página é definida para que as coordenadas passadas para o segundo Graphics::D rawEllipse sejam tratadas como milímetros em vez de pixels. O código faz duas chamadas idênticas ao método Graphics::D rawEllipse . A transformação do mundo é aplicada à primeira chamada Graphics::D rawEllipse e ambas as transformações (mundo e página) são aplicadas à segunda chamada Graphics::D rawEllipse .

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0));

graphics.ResetTransform();
graphics.RotateTransform(30.0f);            // World transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);
graphics.SetPageUnit(UnitMillimeter);       // Page transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);

A ilustração a seguir mostra as duas elipses. Observe que a rotação de 30 graus é sobre a origem do sistema de coordenadas (canto superior esquerdo da área de cliente), e não sobre os centros das elipses. Observe também que a largura da caneta de 1 significa 1 pixel para a primeira elipse e 1 milímetro para a segunda elipse.

captura de tela de uma janela que contém uma elipse pequena e fina e uma elipse grande e mais grossa

 

Área de recorte

Um objeto Graphics mantém uma região de recorte que se aplica a todos os itens desenhados por esse objeto Graphics . Você pode definir a região de recorte chamando o método SetClip .

O exemplo a seguir cria uma região em forma de mais (+), formando a união de dois retângulos. Essa região é designada como a região de recorte de um objeto Graphics . Em seguida, o código desenha duas linhas restritas ao interior da área de recorte.

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0), 5);  // opaque red, width 5
SolidBrush brush(Color(255, 180, 255, 255));  // opaque aqua

// Create a plus-shaped region by forming the union of two rectangles.
Region region(Rect(50, 0, 50, 150));
region.Union(Rect(0, 50, 150, 50));
graphics.FillRegion(&brush, &region);

// Set the clipping region.
graphics.SetClip(&region);

// Draw two clipped lines.
graphics.DrawLine(&pen, 0, 30, 150, 160);
graphics.DrawLine(&pen, 40, 20, 190, 150);

A ilustração a seguir mostra as linhas recortadas.

ilustração mostrando uma forma colorida cruzada por duas linhas vermelhas diagonais