Cursore con immagine associata.

domenica 02 luglio 2006 - 13.10

D0X Profilo | Newbie

Ciao a tutti!

Ero alle prese con il drag & drop di immagini da una picturebox ad un altro controllo in C#. Il drag&drop funziona correttamente ma, durante il movimento del mouse, volevo associare al cursore l'immagine che ho draggato. Stavo facendo delle prove dentro il corpo dell'evento DragOver ma non ho ancora trovato una soluzione.

Qualcuno ha un'idea di come si possa fare?

Io ho provato a disegnare un rectangle catturando la graphics dalla picturebox di origine ma parte non andare. Inoltre, ho provato a costruire esplicitamente un cursore così:

Bitmap b = new Bitmap(My_Image);
Cursor c = new Cursor(b.GetHicon());
Cursor.current = c;

Pare funzionare anche, cioè l'immagine è associata al cursore ma a causa del refresh dovuto allo spostamento del mouse, l'immagine sfarfalla ed è praticamente irriconoscibile... L'effetto che volevo ottenere era un po' lo stesso del ghost drag di una listview....

Grazie anticipatamente!

ciao!

Andy Profilo | Senior Member

Ciao...se le 2 immagini sono all'interno dello stesso form puoi fare questo tentativo...all'inizio del drag setti il tuo cursore personalizzato a tutta la form in cui stai lavorando (Me.cursor = c)


All'evento del drop ripristini il tuo cursore base (Me.cursor = cursors.default)


non sono sicuro che funzioni, non lavoro attivamente con la grafica da tempo..ma tentare non nuoce (e soprattutto non ti porterà via troppo tempo ;P)

Ciao.
Andy

D0X Profilo | Newbie

Ciao!

Grazie per la risposta :D. E' quello che, bene o male. stavo già provando io e questa soluzione non funziona in caso di Drag&Drop a causa del Refresh dovuto all'evendo di DragOver che viene generato più volte quando si passa sul controllo e fa sfarfallare l'immagine associata al nuovo cursore (flicking a manetta :D).

Ho risolto diversamente:

1. Quando viene lanciato un evento DragOver (passando il mouse sul controllo...) lancio una invalidate del controllo stesso.
2. Catturo l'evento paint che viene generato dall'invalidate e costruisco una nuova graphics per il controllo chiamandoci sopra una drawimage per immagine draggata. Alla drawImage passo le coordinate correnti del mouse così ogni volta che viene lanciato un DragOver avviene una repaint del controllo e l'immagine passata a drawimage si sposta insieme al mouse!!!!

Funziona bene!!! Si deve gestire anche l'evento DragLeave del controllo per evitare che, quando ci si sposta con il mouse su una zona per cui non è abilitato il Drag&Drop, l'immagine passata a drawimage rimanga comunque dentro al controllo...si risolve con un booleano settato per bene :D

TnX!

ciao!

banjio78 Profilo | Newbie

scusa potresti scrivere la soluzione??

ho il tuo stesso problema ma nn ho ben capito come lo risolvi....

grazie mille!!!

D0X Profilo | Newbie

ciao!

Non so più che fine ha fatto quel codice preciso....provo a ricostruirlo quando ho un minuto di tempo e te lo posto il prima possibile se riesco...ok? Mi ricordo che funzionava bene anche se poi l'avevo abbandonato perchè mi collideva con altri problemi di gestione....però funzionava....

banjio78 Profilo | Newbie

mi faresti 1 grande piacere....ho l'esame tra 10 giorni!!!

D0X Profilo | Newbie

Ciao!

Allora, scarica l'allegato.

Dovrebbe darti un'idea di come fare. Se vuoi trasportare da picturebox a picturebox c'è il problema che non si riesce a disegnare correttamente sul contesto grafico della picturebox quando ci si passa sopra con il mouse e rimane un problema di zorder. Quando l'ho dovuto fare io, ero impazzito con le picturebox perchè da questo punto di vista sono un controllo balengo e con molte anomalie (basti pensare che non espone direttamente da desiner la proprietà AllowDrop, ma non solo, fa anche schifo nella gestione delle trasparenze e altre cose...) e per questo mi ero reimplementato dei controlli ex-novo. Probabilmente, dovrai farlo anche tu se vuoi trascinare vicino al puntatore del mouse una tumbnail SOPRA + controlli in modo "continuato". Cmq dovrebbe esserti utile.

Ciao!

banjio78 Profilo | Newbie

io ho il problema di trascinare immagini da una listview a un pannello in cui dropparle. come te vorrei che il cursore durante il trascinamento prenda le sembianze dell'iimagine ke ho draggato...

D0X Profilo | Newbie

e allora questo mio codice dovrebbe aiutarti...

banjio78 Profilo | Newbie

sono riuscito ad associare al puntatore l'iimagine draggata ma non capisco perchè la Paint venga fatta solo sulla form sottostante, cioè dietro i controlli(nel mio caso una listview e una picture box). ho visto ke questo accade anche nella tua applicazione....

scusa l'insistenza ma vedo ke hai un pò di esperienza mentre io sono nuovissimo al mondo delle interfaccie!!

grazie mille
ciao

D0X Profilo | Newbie

ciao!

Questo è effettivamente un problema.

Il fatto sta che tu associ l'immagine al puntatore perchè non fai altro, come nella mia applicazione, che disegnare una immagine all'interno del contesto grafico della form, cioè nella paint del controllo.

Ora, l'idea dovrebbe essere quella di implementare nella paint anche degli altri controlli (listview e picturebox) questo disegno in relazione alla posizione corrente del mouse. Purtoppo sembra che nei controlli standard del framework ci sia un "problema", cioè sembra non essere possibile disegnarci direttamente sopra (dovrei fare delle prove ma sembra così).

Nel mio caso, avevo reimplementato un panel personalizzato overraidando la paint da zero. In questo modo potevo disegnare sul contesto grafico senza problemi. Inoltre, non dovevo passare da "un controllo ad un altro". Se ho capito bene tu vuoi draggare l'immagine da un controllo tipo listview, passare su una form (o panel) e terminare il drag su una picture box! Quindi, mentre ti muovi fra i fari controlli dovresti provare ad eseguire la stessa drawimage che fai sul form (come nel mio project) ma nella paint di questi controlli.

Come detto, credo non sia un problema semplice....ora, non so se ho tempo per fare delle prove in questo senso...se le faccio te lo dico :D
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5