 VB.NET  - Criando um gráfico 
de barras
VB.NET  - Criando um gráfico 
de barras
Quer fazer um gráfico de barras de seus dados sem usar muitos recursos nem queimar muitos neurônios ?
Vou mostrar um caminho feliz que se você trilhar chegará ao fim com seu gráfico de barras e nem vai perceber desta vez usando formulários windows.
Tudo bem, a aplicação que vou mostrar neste 
artigo será bem simples ,e , eu fico devendo algo mais elaborado. (quando eu 
tiver um tempo sobrando ... )
)
Neste artigo vou mostrar como criar um gráfico de barras vertical usando as técnicas básicas do GDI+. Neste artigo vou usar basicamente o método Graphics.DrawRectangle() que irá desenhar uma série de retângulos que irão representar as colunas do gráfico.
Inicie um novo projeto no VS.NET do tipo Windows Aplication usando a linguagem VB.NET. No formulário padrão (altere o nome do form para frmGrafico) insira um botão de comando (btnGeraGrafico) e alguns controles TextBox (txtJan, txtFev, txtmar, txtAbr, txtMai) e Labels correspondentes conforme o layout abaixo:
|  | 
Para que possamos desenhar linhas e formas ou exibir imagens com GDI+ , precisamos criar um objeto Graphics. Este objeto representa uma superfície de desenho GDI+ e o objeto criado é usado para criar imagens gráficas.
Podemos trabalhar com gráficos de duas maneiras:
Vamos criar um objeto Graphics a partir de um objeto que derive da classe Image. Fazemos isto usando o método Graphics.FromImage e fornecendo o nome da variável Image a partir da qual o objeto Graphics será criado. No nosso exemplo iremos usar um objeto BitMap.
Vamos declarar duas variáveis que serão usadas no projeto: Uma variável do tipo Graphics e outro do tipo BitMap.
Dim graficoArea As GraphicsNo evento Load do formulário vamos instanciar um objeto do tipo BitMap e atribuir ao objeto graficoArea um gráfico bitmap.
| Private Sub frmGrafico_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load         bmpArea = New Bitmap(Width, Height)
        graficoArea = Graphics.FromImage(bmpArea)End Sub | 
NO evento Paint do formulário inclua o código que irá desenhar a imagem.
| Private Sub frmGrafico_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint e.Graphics.DrawImage(bmpArea, 0, 0) End Sub | 
Finalmente no evento Click do botão - Gerar gráfico das vendas mensais - temos o código que irá processar os dados e gerar o gráfico.
| Private Sub btnGeraGrafico_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGeraGrafico.Click
        'calcula e converte os valores informados em cada mêsDim jan As Integer = CInt(Me.txtJan.Text) / 100 Dim fev As Integer = CInt(Me.txtFev.Text) / 100 Dim mar As Integer = CInt(Me.txtMar.Text) / 100 Dim abr As Integer = CInt(Me.txtAbr.Text) / 100         Dim mai As Integer = CInt(Me.txtMai.Text) / 100
        'Limpa o gráfico        graficoArea.Clear(Me.BackColor)
        'desenha cada retângulo correspondente aos dados de cada mêsgraficoArea.DrawRectangle(New Pen(Color.Red), Me.txtJan.Left + 5, 280 - jan, 40, jan) graficoArea.DrawRectangle(New Pen(Color.Blue), Me.txtFev.Left + 5, 280 - fev, 40, fev) graficoArea.DrawRectangle(New Pen(Color.Magenda), Me.txtMar.Left + 5, 280 - mar, 40, mar) graficoArea.DrawRectangle(New Pen(Color.Brown), Me.txtAbr.Left + 5, 280 - abr, 40, abr)         graficoArea.DrawRectangle(New Pen(Color.greem), Me.txtMai.Left + 5, 280 - mai, 40, mai)
        graficoArea.DrawRectangle(New Pen(Color.Black), 10, 280, Width - 30, 1)        Invalidate()
    End Sub | 
o método DrawRectangle desenha um retângulo definido pelo par de coordenadas , uma largura e uma altura.
O método que iremos usar possui a seguinte assinatura: Graphics.DrawRectangle(Pen, Int32, Int32, Int32, Int32)
Overloads Public Sub DrawRectangle( _
   ByVal 
pen As 
Pen, _
   ByVal x 
As 
Integer, _
   ByVal y 
As 
Integer, _
   ByVal 
width As 
Integer, _
   ByVal 
height As 
Integer _
)
Onde:
pen - representa um objeto Pen que 
determina a cor , largura e estilo do retângulo.
x     - a coordenada x do canto superior esquerdo do 
retângulo a ser desenhado
y     - a coordenada y do canto superior esquerdo do 
retângulo a ser desenhado
width - Largura do retângulo
height - a altura do retângulo
Este método não retorna um valor.
Executando o programa e clicando no botão de comando teremos o gráfico exibido como abaixo:
|  | 
Se você quiser dar um toque a mais e incrementar o gráfico use o método FillRectangle() que irá preencher o interior de um retângulo definido pelo par de coordenadas , altura e largura.
| Private Sub btnGeraGrafico_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGeraGrafico.Click
        Dim jan As Integer = CInt(Me.txtJan.Text) / 100Dim fev As Integer = CInt(Me.txtFev.Text) / 100 Dim mar As Integer = CInt(Me.txtMar.Text) / 100 Dim abr As Integer = CInt(Me.txtAbr.Text) / 100         Dim mai As Integer = CInt(Me.txtMai.Text) / 100
        graficoArea.Clear(Me.BackColor)
        'usando o método FillRectangle par preencher os retângulosgraficoArea.FillRectangle(New SolidBrush(Color.Red), Me.txtJan.Left + 5, 280 - jan, 40, jan) graficoArea.DrawRectangle(New Pen(Color.Red), Me.txtJan.Left + 5, 280 - jan, 40, jan) graficoArea.FillRectangle(New SolidBrush(Color.Blue), Me.txtFev.Left + 5, 280 - fev, 40, fev) graficoArea.DrawRectangle(New Pen(Color.Blue), Me.txtFev.Left + 5, 280 - fev, 40, fev) graficoArea.FillRectangle(New SolidBrush(Color.Magenta), Me.txtMar.Left + 5, 280 - mar, 40, mar) graficoArea.DrawRectangle(New Pen(Color.Magenta), Me.txtMar.Left + 5, 280 - mar, 40, mar) graficoArea.FillRectangle(New SolidBrush(Color.Brown), Me.txtAbr.Left + 5, 280 - abr, 40, abr) graficoArea.DrawRectangle(New Pen(Color.Brown), Me.txtAbr.Left + 5, 280 - abr, 40, abr) graficoArea.FillRectangle(New SolidBrush(Color.Green), Me.txtMai.Left + 5, 280 - mai, 40, mai) graficoArea.DrawRectangle(New Pen(Color.Green), Me.txtMai.Left + 5, 280 - mai, 40, mai) graficoArea.DrawRectangle(New Pen(Color.Black), 10, 280, Width - 30, 1)         Invalidate()
    End Sub | 
O resultado exibido pela execução do programa será:
|  | 
O programa não é lá muito útil , visto que os dados estão fixos no código; mas você pode incrementar o programa obtendo dados de uma base de dados. Como já disse em breve estarei dando um tratamento mais detalhado ao assunto.
Eu sei é apenas VB.NET , mas eu gosto .... 
José Carlos Macoratti