Newsgroup: it.comp.lang.delphi
Titolo: Schermo Virtuale

Ciao, (spero abbiate voglia di stare a leggere è un pò lungo...)
Sto lavorando ad un piccolo programma che dovrebbe tenere una traccia di
tutte le cose che presto in giro.
Sono alle prime linee di codice ed ho già trovato un problema:
In pratica il programma legge il contenuto di una cartella avente dei file
bmp e crea un oggetto t_picture sulla form principale per ogni file (ad ogni
onpaint della form, ciclo sugli oggetti creati e li disegno). E' possibile
prendere gli oggetti creati e spostarli dove si vuole sulla form (il
concetto è che buttando delle immagini rappresentanti gli oggetti che ho
prestato sulle immagini delle persone, crei in automatico una associazione
sul database).
Comunque il problema che ho è solo grafico. In pratica se prendo una
immagine e la trascino sullo schermo questa lascia inevitabilmente una bella
scia.
Posso eliminarla solo chiamando il metodo invalidate della form ad ogni
onmousemove, però questo crea un fastidioso effetto di flicker.
Mi è quindi venuto in mente di usare uno schermo virtuale dove cancellare,
disegnare il tutto e copiare il contenuto dello schermo virtuale sulla form
principale con copyrect. Per fare lo schermo virtuale ho creato un oggetto
tcanvas ma a questo punto non so come assegnare quello che disegno sullo
schermo virtuale al tcanvas della form principale.
Ho assegnato all'handle dello schermo virtuale un dc con createDC ma già qui
ho cominciato a pensare che forse non è il metodo giusto dato che createDC
vuole il nome di un driver di stampante (a meno che non usi lo schermo
specificando 'display') comunque scrivendo esattamente il nome della mia
stampante così come compare nel pannello di controllo sono riuscito a creare
l'oggetto senza errori di runtime ma usando copyrect non viene copiato
niente.
Forse non si può disegnare su un canvas se questo non è associato ad una
finestra visibile?
C'è un altro metodo per evitare il flicker?
Sono sulla strada sbagliata?
Un grazie a tutti per il tempo concessomi.

 principale con copyrect.
Con le ROP ? si, si può fare ma non penso ne valga la pena...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

 però...)
----------------------------
Nell'evento onpaint della form, chiamo una funzione che usa canvas.draw per
disegnare tutte le bitmap, inoltre dato che ho anche le coordinate di ogni
bitmap posso capire se il mouse è sopra un'immagine, se viene lanciato
l'evento mousedown ed il cursore è sopra un'immagine allora vuol dire che
sto facendo drag&drop e l'immagine selezionata assume le coordinate del
mouse (con qualche accorgimento).
E' qui che si presenta il problema, quando trascino l'immagine questa si
lascia dietro una scia che non viene cancellata finché non viene richiamato
un invalidate e se chiamo l'invalidate ogni volta che muovo il mouse ho il
flicker.
Ho trovato un metodo per eliminare il flicker usando le API ma ho ancora
qualche problema
-creo un oggetto tcanvas supplementare
-gli assegno un DC con getcompatibleDC (non mi ricordo se era get o create)
-creo una bitmap per permettere al canvas di disegnare in memoria con
getcompatiblebitmap
-seleziono l'oggetto con selectobject(nuovoDC,nuovaBitmap)
a questo punto posso usare tranquillamente il canvas supplementare per farci
tutto quello che mi pare, ad ogni onpaint cancello il canvas supplementare
con un semplice rect e dopo ciclo su tutti gli oggetti bitmap per disegnarli
a questo punto copio con copyrect dal canvas supplementare sul canvas della
form
ottengo così delle animazioni senza flicker, il piccolissimo problema è che
le immagini sono in bianco e nero.
Il problema sta (credo) nel getcompatibleDC che dovrebbe creare un DC
compatibile con lo schermo attuale (in c++ passando null) in delphi passo
nil (ma ho provato anche con form.canvas.handle) ma quando creo la bitmap
sulla quale disegnare con getcompatiblebitmap ottengo sempre una bitmap ad
un bit... Boh?
Comunque ti ringrazio per il tempo che hai speso per pensare al mio problema
(e per la soluzione che mi hai dato)

 flicker.
è proprio qui che dico che non sfrutti gli oggetti...
Perchè diventare matti a ridisegnarsi le cose a manina con la Draw?
Sposta la TPicture, no?
Immagine.left:=coordinata_del_mouse_x;
immagine.top:=ecc...
Le coordinate le puoi ottenere in vari modi (sfruttando gli eventi come il
MouseOver) oppure richiamando l'API GetCursorPos e facendo le debite
ScreenToClient con la form...
Delphi mette a disposizione la VCL, non ti conviene complicarti troppo la
vita con le API... cmq penso che il problema del bianco-nero che ottieni sul
canvas sia dovuto a:
- come crei il nuovo DC (usa un TCanvas che è meglio...)
- come lo copi so quello "vero"...
