Newsgroup: it.comp.lang.visual-basic
Titolo: [.NET FW 2.0] Flickering nello spostamento di controlli

Salve a tutti,
vi pongo un quesito abbastanza comune al quale però non sono riuscito a
trovare risposta nel mio caso specifico.
Ho un controllo che simula la Explorer Side Bar di Xp (esteticamente
simile a questa per intenderci
http://www.vbaccelerator.com/home/net/code/Controls/Explorer_Bar/explorerBar.png
)
Il controllo l'ho realizzato in puro codice managed, senza chiamata alle
API o altro. Questo per renderlo compatibile con qualsiasi pc con su
installato il FW 2.0 o Mono.
All'espansione di un pannello vi sono vari controlli che si spostano o
si ridimensionano, generando un fastidiosissimo effetto flickering che
può perdurare anche per 3 secondi... e questo su un intel dual core T7500!!!
Oltre ad aggiungere, dopo la InizialiseComponent la seguente istruzione:
Me.SetStyle(ControlStyles.DoubleBuffer Or
ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or
ControlStyles.AllPaintingInWmPaint, True)
Cosa posso fare? Ci sono altre cose a cui devo badare?
Grazie,
Nicola

 può perdurare anche per 3 secondi... e questo su un intel dual core T7500!!!
Avevo un problema simile con un treeview in VB6 su alcune macchine (o in
exe non in debug non ricordo), quando caricavo della roba.
Io risolsi settando visible=false e poi =true, ma nel tuo controllo
immagino non ci siano eventi per inserire queste cose.
Se lo usi su un progetto pulito da problemi?

 Se lo usi su un progetto pulito da problemi?
Si, stesso problema.
grazie,
Nicola

 Però l'idea non è malaccio.
Io su qualcos'altro ho usato lo scompari-riappari, ma mi rendo conto che su
un controllo del genere non va bene come cosa.
Per il resto non saprei proprio dirti, avendo iniziato da poco a guardare
.NET

Qualcuno che ne sappia qualcosa in più?
Nicola

 .NET
Eh fa niente. Vediamo se qualcuno ne sa qualcosa in piů.
Nicola

 Nicola
In altre situazioni (popolamento listview) ho utilizzato il SuspendLayout,
come hai già trovato su google, risolvendo i miei problemi.
Peraltro SuspendLayout non è altro che la trasposizione .NET di una
SendMessage WM_SETREDRAW
Ciao
PaF

 Nicola
Devi usare il visible false/true in versione Dot.net
Oggetto.SuspendLayout
aggiungi oggetti....spostali...facci pure il caffè....
terminato di fare tutte le "porcherie" che vuoi.....
adeso devi ridisegnarlo
lo puoi fare invocando
Oggetto.ResumeLayout
Dimmi come ti va!
p.s.
Ovvio che parecchio del suo ci mette anche cpu e scheda video....ma
non credo che tu abbia 10.000 item da mostrare!...spero di no!

sigh
 item(S) sorry...plurale!
Non mi veniva la parola oggetti
mi sto dissociando....talvolta penso in inglese...e parlo in
italiano....purtroppo l'incontrario non mi riesce altrettanto bene!

 italiano....purtroppo l'incontrario non mi riesce altrettanto bene!
eheheh :D

La cosa assurda è che anche con il suspendlayout e resumelayout non va
come dovrebbe... Sono sicuro che c'è qualche inghippo da qualche parte
ma non lo trovo...
Il problema è che sono vari controlli (label + immagine) contenuti in
degli splitpanel a loro volta contenuti in un panel.
Ora vedo come posso migliorare e vi faccio sapere.
Grazie!
Nicola


IMHO hai qualcosa nel paint che forza un redraw non gestito dal
suspendlayout!
nel senso...hai un sacco di roba li dentro e qualcosa se ne frega del
suspendlayout (d'altronde il pc è stupido ma preciso...fa solo quello
che gli dici di fare)
Guarda questo esempio...è in c#....ma è leggibile... prova a fare come
fa lui!
http://www.pcreview.co.uk/forums/thread-1301356.php
Occhio che esiste anche il comando invalidate per passare dal
paint....non è che hai da qualche parte oggetto.invalidate ???
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invalidate(VS.71).aspx
vers. italiana
http://msdn.microsoft.com/it-it/library/598t492a(VS.80).aspx
utile anche vedere COSA fai nel supendlayout
http://msdn.microsoft.com/it-it/library/system.windows.forms.control.suspendlayout(VS.80).aspx
e poi tanto per complicare ci sarebbe pure il double buffering che può
aiutare a minimizzare il problema
http://msdn.microsoft.com/it-it/library/system.windows.forms.control.doublebuffered.aspx
http://www.bobpowell.net/doublebuffer.htm
...che nel tuo caso potrebbe se c'è tanta roba essere utile!...se già
non l'hai attivato!

 suspendlayout!
Si, ma il casino č capire cosa.
-DoubleBuffer e OptimizedDoubleBuffer attivati.
-Non ho overload del metodo Paint.
-Non ho trovato tracce della invalidate che mi segnalavi.
-Ogni controllo, prima di qualsiasi operazione che comporti
ridimensionamento/spostamento ha il suo bel suspendlayout e resumelayout
alla fine.
-Se un controllo "figlio" viene spostato\ridimensionato, si scatena un
evento "Changing" che forza anche il controllo contenitore (il parent
control per capirci) a suspendlayout...
Insomma, non so piů dove sbattere la testa.
Vi faccio un progettino ti esempio che magari voi trovate errori che io
non riesco a vedere...
Nicola

Noooooooooo... questa la dovete sentire perchè non ci credo!
Copio il progetto del controllo sul desktop.
Creo un progetto nuovo da inviarvi come "test"
Provo e... il flickering è scomparso!
Elimino quindi il progetto del controllo dal mio software.
Importo il progetto che ho appena messo sul desktop.
Il flickering è scomparso anche nel mio programma!
E' come se lui prendesse il riferimento ad un controllo "bloccato"...
Ovviamente tra i riferimenti del mio software c'era l'intero progetto
del controllo, non solo la dll...
Mistero della fede!
Ora funziona.
i vari SuspendLayout e DoubleBuffering quindi hanno funzionato
correttamente.
Grazie a tutti per l'aiuto!
Nicola

 Nicola
Come nel vecchio vb6....una bella compilata risolve tante cose!
Ue bello al prossimo meeting ci fai vedere cosa stai spippolando eh!
a propò quando lo facciamo???

 a propò quando lo facciamo???
Che ne dici di una bella giornata di primavera? Metà aprile può andare?
Nicola