Newsgroup: it.comp.programmare.win32
Titolo: Linee temporanee in una finestra grafica

Sto scrivendo una piccola utility grafica con Borland C++Builder.
Devo far vedere una linea che si sposta insieme al cursore mentre viene 
tracciata (punto iniziale fisso e punto finale al cursore, un classico): 
ora sfrutto l'evento OnMouseMove per "cancellare" la vecchia linea e 
ridisegnare quella spostata, ma il risultato non è per niente buono :-(
Qualcuno conosce il modo di gestire in modo accettabilmente semplice e 
buono quest'operazione di ritraccia? Sto cercando sulla rete ma finora 
ho trovato o troppo (direct3d) o troppo poco... preferirei non mettere 
troppa carne al fuoco.

quello che devi fare non è cancellare la linea vecchia e disegnare quella
nuova (cosa che giustamente causa flickering), ma sovrascrivere l'intero
rettangolo "invalidato" di cui la linea tracciata è diagonale, e a tal
scopo devi tenerti in memoria una copia di tutto quello che può stare
dietro la linea. devi fare double buffering insomma: tieni in memoria
l'immagine di sfondo e in risposta ad OnMouseMove ne prendi il rettangolo
che include la linea, ci disegni la linea, e lo invalidi nella finestra su
cui stai disegnando in modo tale da causare un evento OnPaint al quale
risponderai disegnando il rettangolo.
se lo sfondo è semplice da generare just-in-time (per esempio se si tratta
di un rettangolo monocolore anziché di una fotografia caricata da file)
allora è inutile che ne tieni l'immagine in memoria: puoi rigenerare
ex-novo il rettangolo invalidato ogni volta.
DirectX allo scopo è mostruosamente overkilling :)
è tutto fattibilissimo tramite GDI32 o VCL di Borland, ma per avere
suggerimenti più specifici devi attendere qualcuno che a differenza di me
abbia usato la VCL nell'arco degli ultimi 5 o 6 anni :D
Servizio Tecnico ha scritto:


-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 dietro la linea. devi fare double buffering insomma
Il double buffering era una delle possibilità, infatti.
Io speravo di poter usare un sistema di layer sovrapponibili con il 
DirectDraw; mi sembra il sistema concettualmente più "pulito" di 
risolvere il  problema. Ma visto cosa sono le directX forse non è il 
caso e mi conviene fare come dici.

Servizio Tecnico ha scritto:

Se devi cancellare la vecchia e disegnare la nuova non è necessario che 
invalidi e ridisegni tutto.
Usa la modalità XOR e nella mousemove acquisisci il dc, riscrivi la 
vecchia e poi la nuova. Con lo XOR, tracciando la seconda volta la 
stessa linea, ottieni l'effetto di cancellarla.
Quindi al mousedown acquisisci il punto iniziale, al mosemove disegni in 
xor (prima la vecchia poi la nuova), al mouseup acquisisci il punto 
finale e invalidi tutto, nella paint disegni la linea, tra i due punti, 
nel colore, stile, spessore che desideri.
Ciao

 nel colore, stile, spessore che desideri.
AH! M'ero sempre chiesto a che cavolo servisse poter disegnare in XOR 
con il disegno esistente... ora lo so :o)
grazie...

Servizio Tecnico ha scritto:

Giusto un'altra piccola nota.
La linea (in xor) devi disegnarla di colore bianco, poi potresti avere 
problemi di visibilità con sfondo grigio più o meno uniforme. In 
quest'ultimo caso ti consiglio di disegnarne due di linee, affiancate, 
una bianca e l'altra grigia.
Ciao