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:
System.Drawing - Este é o principal namespace GDI+, ele define objetos para a renderização base(fontes, canetas, escovas básicas, etc.) e o objeto mais importante: Graphics;
System.Drawing.Drawing2D - Permite usar objetos para gráficos bidimensionais vetoriais. Alguns deles são escovas de inclinação, canetas e transformações geométricas;
System.Drawing.Imaging - Se você quer mudar imagens gráficas - ou seja, alterar a paleta, o metadados do extrato de imagem, manipular metafiles, e assim por diante - este é o namespace que você precisa;
System.Drawing.Printing - Para renderizar imagens para a página da impressa, interagir com a própria impressora, e formatar a aparência geral de um trabalho de impressão, use este namespace;
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 :
1- Você pode usar o parâmetro e de evento que é passado para o evento OnPaint com o objeto PaintEventArgs. Vários eventos passam o PaintEventArgse e você pode usá-lo para se referir ao objeto Graphics que já está sendo usado pelo dispositivo do contexto.
2- Você pode usar o método CreateGraphics para um dispositivo de contexto para criar um objeto Graphics.
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)
Para modificar o sistema de coordenadas na superfície do formulário usamos o método ScaleTransform() do objeto Graphics.
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()
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
Este método foi substituído pelos métodos DrawEllipse e FillElipse.
Este método foi substituído pelo método DrawImage()
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().
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:
3 Lables
1 Combobox
1 Panel
1 TextBox
3 Buttons
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: