Newsgroup: it.comp.lang.visual-basic
Titolo: AutoRedraw

Salve... sto creando un controllo utente che mi permetta di disegnare Archi,
linee e tante altre cose. Una specie di picturebox avanzata.
Se imposto al controllo la proprietą Autoredraw=True (in fase di
progettazione) e avvio il progetto, il programma principale che usa il
controllo, periodicamente disegna dei cerchi ma questi non si vedono a meno
che non procedo step-by-step da VB.
Se imposto la proprietą Autoredraw (sempre del controllo utente) su false,
il programma principale riesce a disgnare i cerchi sul mio controllo, solo
che ovviamente quando una finestra si sovrappone a quella del mio progetto
si cancella parte del contenuto.
Come faccio?

 Come faccio?
devi disegnare nell'evento paint...
infatti se imposti a false autoredraw devi gestire tu il repaint
ciao

 infatti se imposti a false autoredraw devi gestire tu il repaint
Si ma io voglio creare un metodo nel mio controllo. Il metodo DrawArc. Cosa
devo fare? Ho cxreato una procedura pubblica (Public Sub DrawArc
(...parametri...) ). Quindi cosa fare per richiamare dall'esterno questo
metodo e non avere problemi?

 metodo e non avere problemi?
ma sei sicuro il autoredraw non ti funziona?  strano..
cmq...
dall'esterno il metodo puoi chiamarlo come ti pare però poi devi tenere
traccia di quello che fai, (e in sequenza giusta)puoi farlo magari creando
un array di variant che identifichi i passi necessari...
l'array dovrà contenere anche i parametri perciò usa un array di variant che
ti permette di fare quello che vuoi
dim
arraySegquenze(numero_di_sequenze,tipo_di_funzione,numero_massimo_parametri)
dim numero_di_funzioni_Da_eseguire
nll'evento paint eseguirai (quando servirà il repaint e non per il primo
draw) di nuovo tutot il repaint avendo traccia di tutte le funzioni da
richiamare...
ciao

Scusa ci stiamo perdendo in un bicchiere d'acqua.
Io voglio creare un metodo come quello che usa la picturebox: Picture1.Line.
All'interno del mio controllo ho creato la procedura DrawArc che richiama
un'API e mi disegna un arco sull'UserControl.
Se nel form_load scrivo MioOggetto.DrawArc(parametri) mi disegna l'arco.
Se perň nel form metto il mio controllo e un timer, setto il timer con
Interval=100 e nell'evento Timer ci metto l'istruzione per disegnare un arco
di dimensione randomizzata, beh i miei archi non si vedono piů. A meno che
non metto Autoredraw del mio oggetto su false. Solo allora riesco a vedere i
cerchietti, ovviamente col problema che ti ho detto prima. Io dall'esterno
voglio solo poter richiamare il mio metodo e vedere i disegni.

 voglio solo poter richiamare il mio metodo e vedere i disegni.
ti sto dicendo che per ogni cerchietto che disegni "devi" ridisegnarlo di
nuovo ogni volta in quanto settando autoredraw a false non c'č piů traccia
dei tuoi disegni,perciň devi tenerla tu.
Se tu disegni mille cerchi nel repaint dovrai disegnarli di nuovo e di
conseguenza dovrai avere la sequenza giusta...
(ma forse non ti ho capito passo la palla) :))

 (ma forse non ti ho capito passo la palla) :))
Io dall'esterno dell'oggetto richiamo il suo metodo:
OGGETTO.DRAWARC(PARAMETRI).
1) Se la proprietà Autoredraw dell'oggetto è impostata su false, allora
riesco a vedere i cerchi. Solo che con Autoredraw settato su False (del mio
oggetto, non del form) l'immagine non viene ridisegnata quando è necessario.
In pratica se ad esempio apro API TEXT VIEWER o una cartella, e la finestra
appare SOPRA al mio programma, quando poi quella finestra si chiude
l'immagine dei cerchietti è sparita, perchè non viene ridisegnata.
2) Se invece Autoredraw del mio oggetto è impostata su TRUE, dovrei aver
risolto il problema di perdere l'immagine dopo che una finestra appare sul
mio programma. Il problema è che impostando Autoredraw su true al mio
oggetto, non si vedono proprio i cerchietti che disegno.
L'evento PAINT del mio form non devo proprio pensarlo, così come non lo
prendo in considerazione quando uso il metodo LINE di una picture box.

 oggetto, non si vedono proprio i cerchietti che disegno.
C'è qualche errore nel tuo oggetto. Fai questo semplice esperimento:
Apri un progetto nuovo. Inserisci uno usercontrol. Forza  autoredraw dello
usercontrol appena creato a True, e dentro allo usercontrol copia questo
codice:
Option Explicit
Public Sub Linea(lFromX As Long, lFromY As Long, lToX As Long, lToY As Long)
   UserControl.Line (lFromX, lFromY)-(lToX, lToY)
End Sub
Chiudi lo usercontrol, e inseriscine una istanza nella form del tuo
progetto. Inserisci anche un pulsante sulla stessa form, e poi nella form
copiaci questo codice:
Option Explicit
Private Sub Command1_Click()
   UserControl11.Linea 0, 0, UserControl11.Width, UserControl11.Height
End Sub
Manda in esecuzione, premi il pulsante e (magia) funziona tutto. Ergo, c'è
un errore nel tuo usercontrol (non è che per caso ci hai messo dentro una
picturebox di sfondo e l'autoredraw lo setti solo allo usercontrol e non
alla picturebox su cui disegni?).
Ciao
*Roby*

alla picturebox su cui disegni?).
Buona idea :-)
Potrebbe anche essere che disegni con funzioni dell' API usando
l' hDC del controllo visualizzato ( e quindi da rinfrescare durante l' ON_PAINT)
piuttosto che con l' hDC interno di VB (quello dell' AutoRedraw=True)?
-- 
ciao, hal

 E non disegno su una picture box ma direttamente sullo sfondo del
controllo.
Vuoi che DrawArc si comporti esattamente come la Line?
Basta che ti fai (cosa che probabilmente hai già fatto) la tua sub
Public Sub DrawArc (...)
    Call Arc(...)
End Sub
Per il fatto che l'arco non si vede con/senza autoredraw è un'altra
questione, fa così anche Line (come volevi, no? ;))
Ricorda che dopo aver disegnato (Line, Circle, DrawArc) devi mettere un bel
If (MioControllo.AutoRedraw) Then MioControllo.Refresh
Così VB nel caso di Autoredraw applica il disegno fatto "di nascosto".
Ciao

 Ciao
Ciaoooooooooooooooo!!!
P.S.: Un grazie a tutti quelli che mi hanno sopportato!

 Come faccio?
Se l'autoredraw e' True, devi fare Picture1.Refresh manualmente =)
Happy Coding =)
Lokar

 Se l'autoredraw e' True, devi fare Picture1.Refresh manualmente =)
Chiedo scusa a Zanna che aveva gia' risposto. Ho letto fino al nono
livello di profondita' (hal) del thread e mi pareva che tutti stavano
guardando troppo in la', mentre il problema era "evidentemente" piu'
semplice ;-)
Happy Coding =)
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt

 Chiedo scusa a Zanna che aveva gia' risposto.
E di che?
Capita che tra l'ultimo refresh del NG e l'"invia" qualcun altro ti precede,
non sei certo l'unico ;)
Ciao