Oppure

Loading
24/01/10 19:10
Rastyn

Ho la necessità di creare (uso Visual Basic 2008) una linea che si muove intorno ad un punto (tipo shermo radar per intenderci)e compi una rotazione ogni n secondi.

Ho creato all'interno dell'evento timer la creazione una volta di una linea con "formGraphics.DrawLine(myPen, larghezza, altezza, x, y)" la chiamata successiva la cancello , facendo un clear su tutto lo schermo "formGraphics.Clear(Color.DarkBlue)".
Come effetto grafico va bene, il problema è che insieme alla linea viene cancellato anche tutto il resto sul form. Lo schermo sono costretto a cancellarlo perchè altrimenti sullo stesso visualizzerei tutte le linee create ad istanti differenti.
Come posso inserire un linea, ad esempio come un oggetto, e farla ruotare tenendo fermo un suo estremo, senza la necessità di volta in volta di cancellare lo schermo.
Pensavo a qualcosa di "RotateTransform" ma non ne riesco a venire a capo.

Il mio evento ad ora lo gestisco così:


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

Dim altezza As Integer
Dim larghezza As Integer

altezza = (Me.Height) / 2
larghezza = (Me.Width) / 2

Dim x As Integer
Dim y As Integer
Dim myPen As New System.Drawing.Pen(System.Drawing.Color.YellowGreen)
Dim formGraphics As System.Drawing.Graphics
formGraphics = Me.CreateGraphics()
myPen.Width = 0.5

If ctrl = 0 Then
x = larghezza + altezza * Math.Cos(angolo)
y = altezza + altezza * Math.Sin(angolo)
formGraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias 'Smoothing della linea
formGraphics.DrawLine(myPen, larghezza, altezza, x, y) ' creo linea
ctrl = 1
ElseIf ctrl = 1 Then
formGraphics.Clear(Color.DarkBlue) 'cancello linea
angolo = angolo + 0.09
ctrl = 0
End If
myPen.Dispose()
formGraphics.Dispose()


Grazie
aaa
24/01/10 19:41
Alfonso
Invece di cancellare lo schermo potresti prima di tracciare la nuova linea, tracciare la precedente con il colore dello sfondo.


E poi togli tutte le dichiarazioni Dim ... da dentro la sub Timer1_Tick e anche i .Dispose.
Considerando che il tick presumo sia di un secondo, è avvilente per il programma dover ogni volta inizializzare e distruggere le variabili
Ultima modifica effettuata da Alfonso 24/01/10 21:27
aaa
25/01/10 8:25
Rastyn

Si ci avevo pensato anche io, ma purtoppo non è corretto, per l'utilizzo che ne devo fare, perchè se la linea si sovrappone con dell'altra grafica quest'ultima rimane "segnata" con una linea di colore delle sfondo.
Quello che mi serve è trattare la linea come un oggetto e fare ruotare sempre la stessa linea cambiandole le coordinate di posizione per un solo estremo (l'altro deve rimanene fisso) oppure "eliminarla fisicamente". Pensavo a qualcosa tipo la classe RotateTransform ma non riesco ad usarla. Qualcuno che l'ha usata sa darmi qualche suggerimento in proposito.

Per i Dim hai perfettamente ragione ma è semplicemente codice di prova per far capire/ e capire io meglio, prima di una stesura più pulita una volta risolto il problema.


aaa
25/01/10 10:56
Il Totem
Dovresti usare il metodo RotateTransform richiamandolo dall'oggetto graphics prima di disegnare qualsiasi altra cosa, e passandogli come argomento l'angolo (in gradi e in senso orario).

Ho specificato "metodo" perchè esiste anche una classe RotateTransform, ma fa parte delle animazioni/trasformazioni di WPF e non è compatibile con Graphics.
aaa
25/01/10 18:33
Rastyn

Anche con la soluzione di usare il metodo RotateTransform, il problema rimane. Ovvero non è che viene ruotata la stessa linea creata, ma devo impostare un angolo ad una linea che vado poi a creare. Con il risultato di avere tante linee create e non una sola usata come un oggetto che ruota.
In pratica data una linea creata, io vorrei cambiargli il suo angolo di posizione di volta in volta.

Grazie

aaa
26/01/10 16:22
Alfonso
Oppure semplicemente:

Nella form1 metti la tua immagine di background
lanci una form2 con transparencykey = colore di background della stessa form2

Disegni le lancette col colore che vuoi e le cancelli con il colore di backgroung

La sovrapponi alla form1
aaa
26/01/10 17:54
Rastyn


Ottimi entrambi i consigli.
Grazie
aaa