Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    193

    [vb.net]Disegnare linee con button

    Ciao a tutti.
    Immagino sia una cosa da nulla ma non riesco a venirne fuori.
    Devo disegnare un serie di linee in un picturebox prelevando le coordinate da una DataGrid,e fino qui tutto bene il problema sorge nel momento in cui voglio che le linee vengano disegnate alla pressione di un button.
    Il codice del button è questo:

    codice:
     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
            'e.Graphics.Clear(Me.BackColor)
            Dim gr As Graphics = e.Graphics
            gr.DrawLine(New Pen(Color.Black), 20, 20, 40, 40)
            gr.DrawLine(New Pen(Color.Black), 40, 40, 40, 80)
    End Sub
    Il problema è che le linee vengono disegnate all'apertura del form e non alla pressione del button.

    Grazie

  2. #2
    Se stai disegnando sul Form ..... é sufficiente che, nell'evento Click del Button, tu faccia un Refresh del form, in modo che venga ri-scatenato anche l'evento Paint.
    E' Ovvio che, le coordinate, dovrai però "pescarle" solo dopo la pressione del Button, altrimenti, le righe, le trovi già disegnate all'apertura del Form.

    Facci sapere...
    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    193
    Ciao
    Non disegno sul form ma su una picturebox,il problema è che al load del form mi trovo già le linee tracciate.
    ho provato anche ad inserire una testbox dove far apparire un valore per capire se è proprio l'evento click che non viene gestito ed infatti è cosi.
    Al caricamento del form mi trovo già anche il valore nella testbox oltre che le righe fatte.
    Ho capito dov'è l'errore ma non sò come fare a risolverlo:
    all'evento click in origine è associato questo:
    codice:
    ByVal e As System.EventArgs) Handles button3.Click
    Dim gr As Graphics = e.Graphics
    Ma se lascio così mi dice che graphics non è un'evento di System.EventArgs
    Allora ho modificato in questo modo:
    codice:
    ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    Dim gr As Graphics = e.Graphics
    Non mi dà errore ma non aspetta più il click,all'apertura del form scatena già gli eventi.
    Lo sò che è mia incapacità ma non trovo soluzione...

  4. #4
    Ti ho già spiegato qual'è il problema e come risolverlo.

    Devi continuare a gestire l'evento Paint della PictureBox, facendo attenzione che non vengano eseguite istruzioni all'avvio del Form.
    Nell'evento Click del Button, è sufficiente eseguire un Refresh della PictureBox per ri-scatenare l'evento Paint dopo aver impostato un Flag a True, il quale, permetterebbe di decidere se eseguire o meno le righe di codice che disegnano nella PictureBox.

    Altra soluzione sarebbe quella di dichiarare, a livello di classe, una variabile di tipo List(Of Point) da valorizzare solo dopo la pression sul Button e, nell'evento Paint della PictureBox, iterare quella collezione per "pescare" le coordinate delle Linee.

    Facci sapere...
    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    193
    ciao
    Inanzitutto grazie per la pazienza ma proprio non ci arrivo...
    Questa è la parte di codice che ho provato a modificare e che dovrebbe gestire la creazione di 2 linee,per ora non recupero i dati ma ho immesso io le coordinate:
    codice:
    Imports System
    Imports System.Windows.Forms
    Imports System.Drawing
    
    Public Class frm_diametri
    
    Private Sub frm_diametri_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            DataGrid1.Columns.Add(1, "X")
            DataGrid1.Columns.Add(2, "Z")
        End Sub
    
        Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
            Dim gr As Graphics = e.Graphics
            gr.DrawLine(New Pen(Color.Black), 0, 300, 20, 300)
            gr.DrawLine(New Pen(Color.Black), 20, 300, 20, 200)
        End Sub
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal d As System.EventArgs) Handles Button3.Click
            PictureBox1.Refresh()
        End Sub
    
    End Class
    Naturalmente all'apertura del form mi trovo già le 2 linee create...

  6. #6
    Questa è la soluzione più semplice ma anche la più "superficiale"

    codice:
    Imports System
    Imports System.Windows.Forms
    Imports System.Drawing
    
    Public Class frm_diametri
    Private Disegna as Boolean=False
    
    Private Sub frm_diametri_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            DataGrid1.Columns.Add(1, "X")
            DataGrid1.Columns.Add(2, "Z")
        End Sub
    
        Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    If Disegna Then
            Dim gr As Graphics = e.Graphics
            gr.DrawLine(New Pen(Color.Black), 0, 300, 20, 300)
            gr.DrawLine(New Pen(Color.Black), 20, 300, 20, 200)
    Disegna=False
    End If
        End Sub
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal d As System.EventArgs) Handles Button3.Click
    Disegna=True
            PictureBox1.Refresh()
        End Sub
    
    End Class
    Facci sapere...
    Ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    193
    Ok perfetto,mi basta questa semplice visto che è funzionale!
    Grazie 1000 ancora

  8. #8
    Nell'evento Click del Button, puoi anche scrivere
    codice:
     PictureBox1.CreateGraphics.DrawLine(Pens.Black, 0, 300, 20, 300)
     PictureBox1.CreateGraphics.DrawLine(Pens.Black, 20, 300, 20, 300)
    Facci sapere...
    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.