Newsgroup: it.comp.lang.visual-basic
Titolo: Cancellazione elemento da PictuireBox

Non so se sia possibile farlo (anzi, penso proprio di no, ma ci provo lo
stesso!): ho una picture box con un disegno, e ho implementeto una routine
tramite la funzioni MouseDown, MouseUp e MoureMove che permette di disegnare
il classico rettangolo di zoom. Il problema è che man mano che trascino il
mouse per definire il rettangolo, disegno senza problemi i nuovi lati, ma
non so come far sparire quelli vecchi. Per ora l'unica soluzione trovata è
stata quella di disegnare sopra ai vecchi segmenti altri segmenti di colore
bianco come lo sfondo della PictureBox. L'inconveniente è però che quando
"cancello" questi segmanti, rimane una striscia bianca sul disegno
sottostante.
Consigli?
Grazie a tutti e ciao!
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 quelli vecchi.
Se per "vecchi" intendi i vecchi lati dello stesso rettangolo di zoom, prova
a porre la proprietą Autoredraw a False prima di iniziare la selezione
(ovvero il disegno del rettangolo di zoom) (magari con un Refresh a ogni
nuovo spostamento/disegno) e a rimetterla a True quando hai finito.

 quando hai finito.
Per esempio (lascia stare che non č un rettangolo), in questo modo (una
PictureBox sul form):
Dim dis As Boolean
Private Sub Form_Load()
    Picture1.AutoRedraw = True
    dis = 0
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    dis = 1
    Picture1.AutoRedraw = False
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    If dis = 0 Then Exit Sub
    Picture1.Refresh
    Picture1.Line (X, 0)-(X, Picture1.ScaleHeight)
    Picture1.Line (0, Y)-(Picture1.ScaleWidth, Y)
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    dis = 0
    Picture1.Refresh
    Picture1.AutoRedraw = True
End Sub

 nuovo spostamento/disegno) e a rimetterla a True quando hai finito.
NOn ho VB a disposizione adesso, ma ho buttato un'occhiata all'MSDN al volo.
Vediamo se ho capito: Autoredraw=False e tutto il mio disegno viene
"bloccato". Prima di disegnare i nuovi lati del rettangolo faccio un Cls che
cancella solo questi ultimi. Conclusa l'operazione riporto Autoredraw=True e
torna tutto come prima.
Se è così, ti faccio un'ultima domanda: se faccio un Refresh, questo
interessa tutto il disegno o solo la parte creata dopo l'impostazione di
Autoredraw=False? Il tutto perchè il resto del disegno è abbastanza
complesso e rallenterebbe troppo.
Grazie infinite!!!!


 complesso e rallenterebbe troppo.
Il Refresh "dimentica" (cancella) tutto ciò che è stato disegnato (con i
vari metodi grafici) da quando AutoRedraw è stato messo a False, ovvero
mantiene solo quanto è stato disegnato con AutoRedraw=True

 mantiene solo quanto č stato disegnato con AutoRedraw=True
OK, chiarissimo.
Grazie ancora!!!!


 sul disegno sottostante.
In alternativa a quanto gia' proposto, puoi disegnare in modalita' vbInvert.
Quando sposti la selezione ti basta ri-disegnare la linea (sulle coordinate
precedenti) per ripristinare il disegno che c'era sotto.
hth,
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org

 Consigli?
Usa una Shape rettangolare con bordo tratteggiato.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Consigli?
La soluzione radicale è usare l'API DrawFocusRect, è fatta apposta:
http://www.google.com/groups?as_q=drawfocusrect&as_ugroup=it.comp.lang.visual-basic&as_scoring=d
Bye, G.