VB.NET - Desenhando figuras 

Neste artigo irei rever alguns pontos básicos :
  • criação de menus
  • utilização de timers
  • geração de números aleatórios
  • desenhar figuras

- Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)

  1. Project Types : Visual Basic Projects
  2. Templates : Windows Forms
  3. Name : DesenhoFigurasNet
  4. Location : c:\vbnet\DesenhoFigurasNet

- Altere o nome do formulário padrão para frmMain e o nome do arquivo para frmMain.vb

- O formulário - frmmain - deverá ter a seguinte aparência :

Inclua o componente MainMenu no formulário e crie um menu com a seguinte estrutura:

Menu
Nível 1
Texto
Nível 2
Texto
Nível 3
Texto
Nome(Propriedade Name de Menuitem) Checked
&Arquivo     (nome padrão)  
  &Figuras   (nome padrão)  
    &Quadrado mnuQuadrados True
    &Retângulo mnuRetangulos False
    &Círculo mnuCirculos False
    &Elipse mnuElipses False
  &Limpar   mnuLimpar False
  &Executar   mnuExecutaPara False
  (Insert Separator)      
  &Sair   mnSair False

Vamos incluir um controle Timer no formulário - frmMain.vb e defina as propriedades do controle como abaixo:

Timer

Propriedade Valor
Name tmrDesenho
Enabled False
Interval 300

O controle Timer possui somente um Evento - Tick - iremos colocar o código associado a este evento de modo que o mesmo seja executado a um intervalo de tempo definido. O número de ticks por segundo é definido pelo propriedade Interval que utiliza o milisegundos (a milionésima parte do segundo). Como definimos Interval igual a 300 ele ocorrerá a cada 3/10 de um segundo.

O código que iremos colocar no evento Tick é o seguinte:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

 

'Os valores para estas variáveis serão gerados aleatóriamente

Dim iRed, iGreen, iBlue As Integer

Dim iX, iY As Integer

Dim iSize As Integer

 

'Determina a largura dos retangulos e elipses

Dim iRectWidth As Integer

'Cria uma variável de referência a classe Graphics

Dim g As Graphics

 

'Referencia g a objeto Graphics object do formulário(Me). Com isto podemos usar os métodos DrawRectangle e DrawEllipse

g = Me.CreateGraphics

 

'Utiliza Randomize para gerar a semente do gerador de números aleatórios.

Randomize()

 

'Gera valores aleatórios entre 0 e 255 para a cor

iRed = Int(Rnd() * 256)

iGreen = Int(Rnd() * 256)

iBlue = Int(Rnd() * 256)

 

'Cria um drawing Pen, definindo sua cor e espessura

Dim PenaDesenho As New Pen(System.Drawing.Color.FromArgb(iRed, iGreen, iBlue), 1)

 

'Gera valores aleatórios entre 5 e 50, para o tamanho das figuras em pixels

iSize = Int(Rnd() * 46) + 5

 

'Gera as posições iniciais X eY para desenha a figura dentro da área do formulário

iX = Int(Rnd() * Me.Width) + 1

iY = Int(Rnd() * Me.Height) + 1

 

End Sub

Neste evento estaremos gerando aleatoriamente valores para algumas variáveis que afetam a cor e o tamanho das figuras que iremos desenhar.

A função Rnd retorna um número aleatório entre 0 e .99999 . Vamos supor que você queira gerar números aleatórios entre 1 e 15 , então você faria assim :  Int(Rnd() * 15) + 1

Entendeu porquê ?  Veja a explicação :

- Rnd() * 15 
Gera números entre  0 e 14.99999, pois
(15 * 0) = 0, and (15 * .99999) = 14.99999

- Rnd() * 15 + 1     
Faz o número entre 1 e 15.99999, pois
(15 * 0) + 1 = 1, and (15 * .99999) + 1 = 15.99999

- Int(
Rnd() * 15) + 1   

Remove o valor decimal , com isto ficamos somente com números entre 1 to 15

E porque usamos o comando Randomize ?

Randomize inicia o gerador de números aleatórios. Sua sintaxe é :  Randomize [ number ]

Randomize use number para iniciar o gerador de números aleatórios da função Rnd dando a ela uma novo valor de semente. Se você omitir number o valor retornado pelo temporizador do sistema será usado como nova semente.

Se você não usar Randomize a função Rnd usará o mesmo número para a semente a primeira vez que for chamada e depois disto usará o último número gerado como valor da semente.

Antes de partir para o código que irá desenhar as figuras vamos  declarar na seção General Declarations as constantes que iremos usar para cada figura:

'Cria uma constante com um valor único para cada figura

Const QUADRADO As Integer = 1

Const CIRCULO As Integer = 2

Const RETANGULO As Integer = 3

Const ELIPSE As Integer = 4

'representa a seleção do usuário

Dim iDesenhaFigura As Integer = QUADRADO

Nesta parte do código irei usar a variável g declarada como referência ao objeto Graphics no evento Tick do timer.

Usando a variável que é uma referência ao objeto Graphics teremos acesso a muitos métodos de desenho . Alguns deles são :

  1. DrawRectangle - Desenha um retângulo e um quadrado
  2. DrawEllipse - Desenha elipses e círculos
  3. DrawPolygon - Desenha formas com múltiplos lados
  4. DrawArc - Desenha arcos de diferentes comprimentos
  5. DrawBezier - Desenha curvas de Bezier

Conforme a seleção do usuário iremos desenhar uma figura. Para isto iremos usar o código abaixo , ele deve ser incluido na continuação do código já incluído no evento Tick do Timer.

Select Case iDesenhaFigura

Case QUADRADO

    g.DrawRectangle(PenaDesenho, iX, iY, iSize, iSize)

Case RETANGULO

    iRectWidth = iSize / 2

    g.DrawRectangle(PenaDesenho, iX, iY, iRectWidth, iSize)

Case CIRCULO

    g.DrawEllipse(PenaDesenho, iX, iY, iSize, iSize)

Case ELIPSE

    iRectWidth = iSize / 3

    g.DrawEllipse(PenaDesenho, iX, iY, iRectWidth, iSize)

End Select

Estamos usando uma instância (PenaDesenho) da classe Pen como primeiro parâmetro para realizar o desenho. Esta instância foi criada no evento Tick do controle Timer. O objeto Pen determina a cor e espessura das linhas que serão desenhadas. (       g.DrawRectangle(DrawPen, iX, iY, iSize, iSize)

O segundo e o terceiro parâmetor passado para os métodos de desenho determinam a localização X e Y no formulário onde a figura sera desenhada.( g.DrawRectangle(DrawPen, iX, iY, iSize, iSize)

Os outros dois parâmetros determina a largura e altura da figura.(g.DrawRectangle(DrawPen, iX, iY, iSize, iSize)

Como muitos dos métodos de desenho são Sobrecarregados , os parâmetros passados podem ser formatados de diferentes formas. Assim , no código abaixo estamos usando apenas dois parâmetros : Pen e Retangulo:

Dim MyRect As New Rectangle()
MyRect.X = iX
MyRect.Y = iY
MyRect.Width = iSize
MyRect.Height = iSize
g.DrawRectangle(DrawPen, MyRect)

Antes de poder testar o aplicativo devemos atribuir o código as opções do Menu para que as figuras possam ser selecionadas e desenhas. O código é dado a seguir para as quatro opções de figuras:

Private Sub mnuQuadrados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuQuadrados.Click

If mnuQuadrados.Checked <> True Then

mnuQuadrados.Checked = True

mnuCirculos.Checked = False

mnuElipses.Checked = False

mnuRetangulos.Checked = False

iDesenhaFigura = QUADRADO

End If

End Sub


Private Sub mnuRetangulos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuRetangulos.Click

If mnuRetangulos.Checked <> True Then

mnuRetangulos.Checked = True

mnuCirculos.Checked = False

mnuElipses.Checked = False

mnuQuadrados.Checked = False

iDesenhaFigura = RETANGULO

End If

End Sub
 


Private Sub mnuCirculos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCirculos.Click

If mnuCirculos.Checked <> True Then

mnuCirculos.Checked = True

mnuRetangulos.Checked = False

mnuElipses.Checked = False

mnuQuadrados.Checked = False

iDesenhaFigura = CIRCULO

End If

End Sub
 


Private Sub mnuElipses_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuElipses.Click

If mnuElipses.Checked <> True Then

mnuElipses.Checked = True

mnuRetangulos.Checked = False

mnuCirculos.Checked = False

mnuQuadrados.Checked = False

iDesenhaFigura = ELIPSE

End If

End Sub

Finalmente o código que deve ser associado ao evento Click do menu Executar. O usuário deve selecionar uma figura e clicar no item Executar onde o código a seguir será executado iniciando o processo. Para iniciar o desenho de outra figura o usuário deverá clicar na opção parar , ir no item Figuras e selecionar a figura que deseja desenhar:

Private Sub mnuExcutarParar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuExecutarParar.Click

If mnuExecutarParar.Text = "&Executar" Then

  'muda o texto do menu

   mnuExecutarParar.Text = "&Parar"

   'ativa o timer

  Timer1.Enabled = True

Else

   'muda o texto do menu

   mnuExecutarParar.Text = "&Executar"

   'desativa o timer

   Timer1.Enabled = False

End If

End Sub

Agora execute o projeto e veja o resultado:

Ah !!! esqueci do código para limpar o formulário. No evento Click do menu Limpar apenas declare:

Me.Refresh

Para sair declare no evento Click do menu Sair : Me.close

Por hoje é só , aguarde mais artigos VB.NET...

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

Referências:


José Carlos Macoratti