Newsgroup: it.comp.lang.visual-basic
Titolo: VB.NET e grafica... lungo

Ciao a tutti
E' da poco che utilizzo 
VB.NET
 ed ho un problema che sicuramente
voi sapete risolvermi.
Utilizzando vb6, per tracciare una linea su un controllo bastava fare:
controllo.line [coordinate]
ed avere la propietà autoredraw a true (oppure ti richiamavi manualmente  
il metodo di
redraw del controllo).
In 
VB.NET
, pensavo che si dovesse fare così:
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  
System.EventArgs) Handles MyBase.Load
         Dim g As System.Drawing.Graphics
         Dim p As Pen
         p = New Pen(Color.Black, 3)
         g = Me.CreateGraphics()
         g.DrawLine(p, 10, 10, 100, 100)
     End Sub
E in questo modo mi aspettavo di far partire il mio progetto e di vedere  
una linea nera sul mio
form. Invece, il programma compila perfettamente ma NON fa assolutamente  
nulla!!!
Dopo essermi scervellato ed essere andato a controllare la msdn, ho  
trovato un sistema che
sembra funzionare, ovvero si va a toccare l'evento paint di form1 e si  
traccia la linea da lì...
     Private Sub Form1_Paint(ByVal sender As Object, ByVal e As  
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
         Dim p As Pen
         p = New Pen(Color.Black, 3)
         e.Graphics.DrawLine(p, 10, 10, 100, 100)
     End Sub
Ora, in ultima analisi utilizzerò questo metodo ma... è possibile che per  
fare una linea,
invece di chiamare qualche metodo di una classe appositamente creata,  
debba richiamare un
metodo che mi scateni l'evento paint? Come gestisco eventuali altri  
"disegni" nello stesso
form? Con variabili globali e sempre dall' evento paint tramite select  
case o roba simile??
Sono sicuro che questo non è l'unico metodo (anzi, è quello decisamente  
sbagliato) ma l'msdn
fa solamente questo esempio e io non so più che pesci pigliare.
Inoltre, un'altra domanda... utilizzando questo metodo ho notato che  
l'evento Form1_paint mi va
di default a ridisegnare l'area (il controllo) dopo averlo pulito (come se  
facesse un cls prima
di disegnare la linea) ... Io invece, vorrei che questo non accadesse... è  
possibile??
Grazie mille a tutti coloro avranno la pazienza di rispondermi e scusate  
per l'eccessiva
lunghezza del post.
Saluti
-- 
RTR

 controllo.line [coordinate]
[Taglio]
In fase di stanza della form,
  Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
        Dim g As System.Drawing.Graphics = Me.CreateGraphics
        Dim blackPen As New Pen(Color.Black, 3)
        g.DrawLine(blackPen, 20, 15, 400, 15)
    End Sub
Presumo che il seguente è meglio:
Dim blackPen As New Pen(Color.Black, 3)
e.Graphics.DrawLine(blackPen, 20, 15, 400, 15)
Se vuoi disegnare a comando:
   Private Sub cmdLinea_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdLinea.Click
        Dim g As System.Drawing.Graphics = Me.CreateGraphics
        Dim blackPen As New Pen(Color.Black, 3)
        g.DrawLine(blackPen, 20, 15, 400, 15)
        g.DrawLine(Pens.Blue, 20, 25, 300, 35)
        g.DrawLine(Pens.Blue, 20, 45, 300, 35)
        g.DrawLine(Pens.Blue, 20, 25, 20, 45)
        Dim redPen As New Pen(Color.Red, 5)
        g.DrawLine(redPen, 5, 100, 250, 100)
    End Sub
Considera che il paint si attiva al variare delle dimensioni del form,
quindi, potresti avere necessità di un aggiornamento grafico.
Ave
giuseppeD
---
CCR

Vlad,
VB6 ti permetteva di scrivere direttamente in una picturebox senza dovere 
gestire eventuali Paint perche' era l'infrastruttura che si occupava di fare 
tutto questo (ricorderai senz'altro la proprieta' AutoRedraw).
In .NET le cose sono cambiate, e il modo di funzionamento e' quello del SO 
stesso, ovvero quando un controllo deve essere ridisegnato, il controllo 
stesso riceve un WM_INVALIDATE e questo genera di conseguenza un messaggio 
WM_PAINT che si traduce nell'evento Paint all'interno del quale devi mettere 
il codice per disegnare.
Lo fa windows quando disegna i controlli, quindi lo devi fare anche tu...
Ovviamente questo richiede una revisione del modo di disegnare, ma GDI+ ha 
un sacco di metodi utili (vedi ad esempio DrawPoligon)
HTH
-- 
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - 
http://www.ugidotnet.org
Weblog: 
http://www.ugidotnet.org/710.blog

     End Sub
[snip]
Grazie mille!!! Ora è tutto ok!!!
Un codice simile lo avevo scritto anche io ma lo avevo legato (per fare la  
prova) all'evento
form_load... legato al form_load non funziona, mentre legato a qualsiasi  
altra cosa sì!!
Grazie ancora.
Ciao
-- 
Using Opera's revolutionary e-mail client: 
http://www.opera.com/m2/

1-Usare la Dispose su redPen e g (sono risorse GDI non dimentichiamo)
2-Che succede se una finestra passa sopra il form dove hai appena disegnato 
o minimizzi e massimizzi il Form?...


 o minimizzi e massimizzi il Form?...
Non c'è che dire... mi hai stupito!! :D
Per quanto riguarda la Dispose ... già fatto... lo avevo già letto  
sull'MSDN ma per quanto
riguarda il punto 2 .... PERCHE'??? Come fare per non far sparire  
tutto????????
Ciao e grazie mille


> Come fare per non far sparire  tutto????????
Ti sei gia' risposto prima... devi ridisegnare tutto quando Windows ha la 
necessita' di farlo, ovvero quando ti invia l'evento Paint.
HTH


 necessita' di farlo, ovvero quando ti invia l'evento Paint.
Non ho provato e non saprei come fare, ma per "simulare l'Autoredraw" non si
potrebbe disegnare il tutto su una bitmap in memoria e poi, nell'evento
paint semplicemente sostituire la bitmap del form con la nostra?
Ciao


Grazie per tutto... Ho risolto come mi hai suggerito tu: faccio il mio  
grafico ed in
caso di evento paint ridisegno. L'applicazione è velocissima, la roba da  
ridisegnare è poca...
nessun problema dunque.
Grazie ancora.
Ciao


 paint semplicemente sostituire la bitmap del form con la nostra?
E' esattamente quello che fa Autoredraw in VB6 e, sotto un certo aspetto, l' 
opzione di DoubleBuffering


 opzione di DoubleBuffering
Esatto, VB6 fa un double buffering automatico.
Era per questo che mi č venuta questa idea.
Ciao
-- 
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net