VB .NET - Desenhando Gráficos com Graphics


 Hoje temos vamos revisar os conceitos da classe Graphics que encapsula o GDI+ e permite desenhar em uma superfície : formulário, controle, etc., usando seus principais métodos e propriedades.

Usar os recursos do GDI + é a maneira de desenhar formas, fontes, imagens ou geralmente qualquer coisa gráfica no Visual Basic .NET.

Os namespaces em GDI + são:

O lugar para começar com GDI + é o objeto Graphics. Embora as coisas que você desenha apareçam em seu monitor ou em uma impressora, o objeto Graphics é a "tela" onde você desenha.

Mas o objeto Graphics é também uma das primeiras fontes de confusão ao usar GDI +. O objeto Graphics está sempre associado a um contexto de dispositivo particular.

Assim, o primeiro problema que praticamente cada novo aluno do GDI+ confronta é: "Como faço para obter um objeto Graphics ?"

Existem basicamente duas formas :

Além do objeto Graphics você usará também com muita frequência os objetos : Colors, Pen e Fonts:

1-) - Objeto Color - Você pode definir cores para desenhar usando o objeto Color de diversas formas. Após criar uma instância da classe Color você pode escolher a cor de uma relação de cores exibidas para o objeto.

Exemplo:
'usando um cor definida para objeto
Dim colorBackground As Color = Color.Cornsilk

Você pode também construir suas próprias cores definindo cada componente red, green e blue da cor com valores de 0 até 255:

Exemplo:
Dim colorRed As Color = Color.FromArgb(255, 0, 0)
Dim colorTransparentGreen As Color = Color.FromArgb(127, 0, 255, 0)


2-) Objeto Pen - Este objeto é usado como um parâmetro para muitos métodos de desenho : linhas, elipses, retângulos e polígonos são todos desenhados usando um objeto Pen para definir as linhas usadas para construí-los.

Um objeto Pen básico é composto de uma cor e de uma largura opcional. Se a largura não for definida , o padrão é usar 1 unidade (o modo escala deve estar definido para pixels). Se você definir uma escala diferente , embora a largura continue com o mesmo valor, a aparência deverá ser modificada.

Exemplo:
' ----- Cria objetos Pens.
Dim pen1 As New Pen(Color.Blue)
Dim pen2 As New Pen(colorRed, 25)


3-) Objeto Font 
- Estes objetos são requeridos sempre que um texto for desenhado na superfície gráfica. Existem diversas formas de definir um novo objeto Font: você pode especificar o seu nome e algumas propriedades como tamanho, ou pode começar com uma fonte já dada e efetuar alterações:

Exemplo:
' -----Cria fontes
Dim font1 As New Font("Arial", 24, FontStyle.Bold Or FontStyle.Italic)
Dim font2 As New Font(Me.Font, FontStyle.Regular

Após repassar estes conceitos básicos sobre os novos recursos de desenho no VB.NET vejamos a seguir como substituir alguns dos controles de desenho usados no VB6:

1- O controle Line

Você pode desenhar linhas em um formulário, no evento Paint, usando o método DrawLine().

Para desenhar uma linha você vai precisar conhecer duas coisas:

Você pode criar um objeto Pen previamente ou pode usar diretamente como argumento do método DrawLine. Na posição final e inicial da linha você pode usar objetos Point - que podem ter sidos criados previamente ou serem usados como argumentos - ou simplesmente usar valores para representar as posições de X e Y do inicio e do fim da linha.

Para desenhar uma linha reta usando os objetos Pen e Point podemos fazer:

Dim p As Pen = New Pen(Color.blue, 3)

Os objetos Point podem ser criados da mesma maneira:

Dim P1 As Point = New Point(20, 20)
Dim P2 As Point = New Point(100, 50)

Exemplo para desenhar a linha :

g.DrawLine(p, P1, P2)

2- O método Cls()

Para limpar uma superfície gráfica , você usa o método Clear() passado como argumento na cor usada para a superfície:

e.Graphics.Clear(Color.White)
3- O método Scale()

Para modificar o sistema de coordenadas na superfície do formulário usamos o método ScaleTransform() do objeto Graphics.

4- O método PSet()

Não há no VB.NET nenhum método que pode ser usado para desenhar um único pixel na superfície gráfica. Podemos simular o efeito usando os métodos DrawLine(), DrawRectangle(), ou FillRectangle() e fornecer coordenadas precisas. Outra forma de desenhar um simples ponto é criar um bitmap representando um ponto e desenhar o bitmap :

' ----- Desenha um ponto vermelho
Dim novoBitmap As New Bitmap(1, 1)
novoBitmap.SetPixel(0, 0, Color.Red)
e.Graphics.DrawImageUnscaled(novoBitmap, 15, 15)
novoBitmap.Dispose()

 
5- O método Point()

Embora o objeto Graphics não permita consultar a cor individual de um pixel, você pode isto usando o objeto BitMap. O método GetPixel deste objeto retorna a cor do objeto para o pixel especificado

6- O método Circle()

Este método foi substituído pelos métodos DrawEllipse e FillElipse.

7- O método PaintPicture()

Este método foi substituído pelo método DrawImage()

8- Desenhar retângulos e elipses

Para desenhar formas retangulares e elipses podemos usar os métodos DrawRectangle() e DrawEllipse. Se desejar desenhar estas figuras preenchidas deve-se usar os métodos FillRectangle() e FillEllipse().

9- Retângulo com cantos arredondados

Não há um método para desenhar um retângulo com cantos arredondados no VB.NET. Para realizar esta tarefa você deverá usar uma combinação dos métodos DrawLine() e DrawArc().

Recursos usados :

Criando Gráficos com os recursos do GDI+

Abra o VS Express 2013 for Windows Desktop e clique em New Project;

A seguir selecione a linguagem Visual Basic e o template Windows Forms Application;

Informe o nome Graficos  e clique no botão OK;

A seguir selecione o  formulário padrão form1.vb e partir da ToolBox, os seguintes controles:

Defina os controles no formulário com o seguinte leiaute:

A seguir defina o seguinte código no formulário :

   Private Sub Estrela(ByVal g As Drawing.Graphics, ByVal XCenter As Integer, ByVal YCenter As Integer, ByVal Radius As Integer, ByVal Sides As Integer, ByVal StarColor As Color)
        Dim points(Sides - 1) As Point
        Dim i As Integer
        Dim theta, dtheta As Double
        Dim p As New Pen(StarColor)
        theta = 90
        dtheta = 360 / Sides
        For i = 0 To Sides - 1
            points(i).X = XCenter + Radius * Math.Cos(theta * Math.PI / 180)
            points(i).Y = YCenter - Radius * Math.Sin(theta * Math.PI / 180)
            theta += dtheta
        Next
        For i = 0 To Sides - 1
            g.DrawLine(p, points(i).X, points(i).Y, points((i + 2) Mod Sides).X, points((i + 2) Mod Sides).Y)
        Next
    End Sub

    Private Sub Diamante(ByVal g As Drawing.Graphics, ByVal XCenter As Integer, ByVal YCenter As Integer, ByVal Radius As Integer, ByVal Sides As Integer, ByVal DiamondColor As Color)
        Dim points(Sides - 1) As Point
        Dim i, k As Integer
        Dim theta, dtheta As Double
        Dim p As New Pen(DiamondColor)
        theta = 90
        dtheta = 360 / Sides
        For i = 0 To Sides - 1
            points(i).X = XCenter + Radius * Math.Cos(theta * Math.PI / 180)
            points(i).Y = YCenter - Radius * Math.Sin(theta * Math.PI / 180)
            theta += dtheta
        Next
        For i = 0 To Sides - 1
            For k = 0 To Sides - 1
                g.DrawLine(p, points(i).X, points(i).Y, points(k).X, points(k).Y)
            Next
        Next
    End Sub

    Private Sub Poligono(ByVal g As Drawing.Graphics, ByVal XCenter As Integer, ByVal YCenter As Integer, ByVal Radius As Integer, ByVal Sides As Integer, ByVal PolygonColor As Color)
        Dim points(Sides - 1) As Point
        Dim i As Integer
        Dim theta, dtheta As Double
        Dim p As New Pen(PolygonColor)
        theta = 90
        dtheta = 360 / Sides
        For i = 0 To Sides - 1
            points(i).X = XCenter + Radius * Math.Cos(theta * Math.PI / 180)
            points(i).Y = YCenter - Radius * Math.Sin(theta * Math.PI / 180)
            theta += dtheta
        Next
        g.DrawPolygon(p, points)
    End Sub

    Private Sub CirculosCentrados(ByVal g As Drawing.Graphics, ByVal XCenter As Integer, ByVal YCenter As Integer, ByVal SmallRadius As Integer, ByVal LargeRadius As Integer,
 ByVal numerosCirculos As Integer, ByVal CirclesColor As Color)
        Dim i As Integer
        Dim p As New Pen(CirclesColor)
        Dim L, T As Integer
        Dim Radius, DRadius As Single
        Radius = SmallRadius
        DRadius = (LargeRadius - SmallRadius) / (numerosCirculos - 1)
        For i = 1 To numerosCirculos
            L = XCenter - Radius
            T = YCenter - Radius
            g.DrawEllipse(p, L, T, 2 * Radius, 2 * Radius)
            Radius += DRadius
        Next
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        cboFormas.SelectedIndex = 0
    End Sub
    Private Sub ShapeCombo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboFormas.SelectedIndexChanged
        Select Case cboFormas.SelectedIndex
            Case 0
                Label2.Text = "Número de Vertices"
                Label2.Show()
                txtNumeros.Show()
            Case 1
                Label2.Text = "Número de Sides"
                Label2.Show()
                txtNumeros.Show()
            Case 2
                Label2.Text = "Número de Vertices"
                Label2.Show()
                txtNumeros.Show()
            Case 3
                Label2.Text = "Número de Circulos"
                Label2.Show()
                txtNumeros.Show()
            Case Else
                Label2.Hide()
                txtNumeros.Hide()
        End Select
    End Sub
    Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click
        End
    End Sub
    Private Sub btnLimpar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpar.Click
        PainelDesenho.CreateGraphics.Clear(Me.BackColor)
    End Sub
    Private Sub btnDesenhar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDesenhar.Click
        Dim g As Drawing.Graphics
        Dim DrawingColor As Color
        Dim p As Pen
        DrawingColor = Color.Blue
        p = New Pen(DrawingColor)
        p.Width = "5"
        g = PainelDesenho.CreateGraphics
        Select Case cboFormas.SelectedIndex
            Case 0
                Estrela(g, 175, 175, 140, txtNumeros.Text, DrawingColor)
            Case 1
                Poligono(g, 175, 175, 140, txtNumeros.Text, DrawingColor)
            Case 2
                Diamante(g, 175, 175, 140, txtNumeros.Text, DrawingColor)
            Case 3
                CirculosCentrados(g, 175, 175, 35, 140, txtNumeros.Text, DrawingColor)
            Case 4
                g.DrawEllipse(p, 35, 35, 280, 280)
            Case 5
                g.DrawEllipse(p, 35, 50, 280, 150)
            Case 6
                g.DrawArc(p, 50, 50, 150, 150, 135, 210)
            Case 7
                Dim points(5) As Point
                points(0).X = 50 : points(0).Y = 50
                points(1).X = 150 : points(1).Y = 140
                points(2).X = 150 : points(2).Y = 175
                points(3).X = 280 : points(3).Y = 75
                points(4).X = 150 : points(4).Y = 170
                points(5).X = 230 : points(5).Y = 175
                g.DrawCurve(p, points)
            Case 8
                g.DrawBezier(p, 50, 150, 150, 75, 170, 170, 70, 175)
            Case 9
                g.DrawRectangle(p, 35, 35, 280, 280)
            Case 10
                Dim r As New Drawing.Rectangle(0, 0, 250, 250)
                Dim b As New Drawing2D.LinearGradientBrush(r, Color.Red, Color.Black, 45)
                g.FillEllipse(b, 35, 35, 280, 280)
            Case 11
                Dim r As New Drawing.Rectangle(0, 0, 250, 250)
                Dim b As New Drawing2D.HatchBrush(Drawing2D.HatchStyle.Wave, DrawingColor)
                g.FillEllipse(b, 35, 35, 280, 280)
            Case 12
                Dim r As New Drawing.Rectangle(0, 0, 250, 250)
                Dim b As New Drawing.SolidBrush(DrawingColor)
                g.FillEllipse(b, 35, 35, 280, 280)
        End Select
    End Sub
    Private Sub DrawingPanel_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PainelDesenho.Paint
        PainelDesenho.CreateGraphics.DrawEllipse(New Pen(Color.Blue), 0, 0, 280, 280)
    End Sub
    Private Sub DrawingPanel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles PainelDesenho.Click
        PainelDesenho.CreateGraphics.DrawEllipse(New Pen(Color.Black), 0, 0, 280, 280)
    End Sub

Executando o projeto e desenhando uma figura das disponíveis temos:

Pegue o projeto completo aqui: Graficos.zip

Porque do céu se manifesta a ira de Deus sobre toda a impiedade e injustiça dos homens, que detêm a verdade em injustiça.
Porquanto o que de Deus se pode conhecer neles se manifesta, porque Deus lho manifestou.
Porque as suas coisas invisíveis, desde a criação do mundo, tanto o seu eterno poder, como a sua divindade, se entendem, e claramente se vêem pelas coisas que estão criadas, para que eles fiquem inescusáveis;


Romanos 1:18-20

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti