Trasferimento di oggetti shell con trascinamento della selezione e appunti
Articolo
Molte applicazioni consentono agli utenti di trasferire i dati in un'altra applicazione trascinando e rilasciando i dati con il mouse o usando gli Appunti. Tra i molti tipi di dati che è possibile trasferire sono oggetti Shell, ad esempio file o cartelle. Il trasferimento dei dati della shell può essere eseguito tra due applicazioni, ma gli utenti possono anche trasferire i dati shell da o verso il desktop o Esplora risorse.
Anche se i file sono l'oggetto Shell più comunemente trasferito, il trasferimento dei dati della shell può comportare qualsiasi varietà di oggetti presenti nello spazio dei nomi shell. Ad esempio, l'applicazione potrebbe dover trasferire un file in una cartella virtuale, ad esempio il Cestino, o accettare un oggetto da un'estensione dello spazio dei nomi non Microsoft. Se si implementa un'estensione dello spazio dei nomi, deve essere in grado di comportarsi correttamente come origine di rilascio e destinazione.
Questo documento illustra come le applicazioni possono implementare trasferimenti di dati di trascinamento della selezione e appunti con oggetti Shell.
Windows offre due modi standard per le applicazioni per trasferire i dati shell:
Un utente taglia o copia i dati della shell, ad esempio uno o più file, negli Appunti. L'altra applicazione recupera i dati dagli Appunti.
Un utente trascina un'icona che rappresenta i dati dall'applicazione di origine e rilascia l'icona in una finestra di proprietà della destinazione.
In entrambi i casi, i dati trasferiti sono contenuti in un oggetto dati. Gli oggetti dati sono oggetti COM (Component Object Model) che espongono l'interfaccia IDataObject . Nello schema, esistono tre passaggi essenziali che tutti i trasferimenti di dati shell devono seguire:
L'origine crea un oggetto dati che rappresenta i dati da trasferire.
La destinazione riceve un puntatore all'interfaccia IDataObject dell'oggetto dati.
La destinazione chiama l'interfaccia IDataObject per estrarre i dati da esso.
La differenza tra gli Appunti e i trasferimenti di dati con trascinamento della selezione risiede principalmente nel modo in cui il puntatore IDataObject viene trasferito dall'origine alla destinazione.
Trasferimenti di dati degli Appunti
Gli Appunti sono il modo più semplice per trasferire i dati della shell. La procedura di base è simile ai trasferimenti di dati standard degli Appunti. Tuttavia, poiché si trasferisce un puntatore a un oggetto dati, non i dati stessi, è necessario usare l'API degli Appunti OLE anziché l'API degli Appunti standard. La procedura seguente illustra come usare l'API Degli Appunti OLE per trasferire i dati della shell con gli Appunti:
L'origine dati crea un oggetto dati per contenere i dati.
L'origine dati chiama OleSetClipboard, che inserisce un puntatore all'interfaccia IDataObject dell'oggetto dati negli Appunti.
La destinazione chiama OleGetClipboard per recuperare il puntatore all'interfaccia IDataObject dell'oggetto dati.
Con alcuni trasferimenti di dati shell, la destinazione potrebbe anche dover chiamare il metodo IDataObject::SetData dell'oggetto dati per fornire commenti e suggerimenti all'oggetto dati sul risultato del trasferimento dei dati. Per un esempio di questo tipo di operazione, vedere Gestione delle operazioni di spostamento ottimizzate .
Trascinamento dei trasferimenti di dati
Sebbene un po' più complesso da implementare, il trasferimento dei dati di trascinamento della selezione presenta alcuni vantaggi significativi rispetto agli Appunti:
I trasferimenti di trascinamento della selezione possono essere eseguiti con un semplice movimento del mouse, rendendo l'operazione più flessibile e intuitiva da usare rispetto agli Appunti.
Il trascinamento della selezione fornisce all'utente una rappresentazione visiva dell'operazione. L'utente può seguire l'icona mentre passa dall'origine alla destinazione.
Il trascinamento della selezione notifica alla destinazione quando i dati sono disponibili.
Le operazioni di trascinamento della selezione usano anche oggetti dati per trasferire i dati. Tuttavia, l'origine di rilascio deve fornire funzionalità oltre a quella necessaria per i trasferimenti degli Appunti:
L'origine di rilascio deve anche creare un oggetto che espone un'interfaccia IDropSource . Il sistema usa IDropSource per comunicare con l'origine mentre l'operazione è in corso.
L'oggetto dati di trascinamento della selezione è responsabile del rilevamento dello spostamento del cursore e della visualizzazione di un'icona per rappresentare l'oggetto dati.
Le destinazioni di rilascio devono anche fornire più funzionalità di quanto sia necessario per gestire i trasferimenti degli Appunti:
La destinazione di rilascio deve esporre un'interfaccia IDropTarget . Quando il cursore si trova su una finestra di destinazione, il sistema usa IDropTarget per fornire alla destinazione informazioni quali la posizione del cursore e per notificare quando i dati vengono eliminati.
La destinazione di rilascio deve registrarsi con il sistema chiamando RegisterDragDrop. Questa funzione fornisce al sistema l'handle a una finestra di destinazione e un puntatore all'interfaccia IDropTarget dell'applicazione di destinazione.
Nota
Per le operazioni di trascinamento della selezione, l'applicazione deve inizializzare COM con OleInitialize, non CoInitialize.
La procedura seguente illustra i passaggi essenziali usati in genere per trasferire i dati della shell con trascinamento della selezione:
La destinazione chiama RegisterDragDrop per assegnare al sistema un puntatore all'interfaccia IDropTarget e registrare una finestra come destinazione di rilascio.
Quando l'utente avvia un'operazione di trascinamento della selezione, l'origine crea un oggetto dati e avvia un ciclo di trascinamento chiamando DoDragDrop.
Quando il cursore si trova sulla finestra di destinazione, il sistema invia una notifica alla destinazione chiamando uno dei metodi IDropTarget della destinazione. Il sistema chiama IDropTarget::D ragEnter quando il cursore entra nella finestra di destinazione e IDropTarget::D ragOver quando il cursore passa sulla finestra di destinazione. Entrambi i metodi forniscono la destinazione di rilascio con la posizione corrente del cursore e lo stato dei tasti di modifica della tastiera, ad esempio CTRL o ALT. Quando il cursore lascia la finestra di destinazione, il sistema invia una notifica alla destinazione chiamando IDropTarget::D ragLeave. Quando uno di questi metodi viene restituito, il sistema chiama l'interfaccia IDropSource per passare il valore restituito all'origine.
Quando l'utente rilascia il pulsante del mouse per eliminare i dati, il sistema chiama il metodo IDropTarget::D rop di destinazione. Tra i parametri del metodo è presente un puntatore all'interfaccia IDataObject dell'oggetto dati.
La destinazione chiama il metodo IDataObject::GetData dell'oggetto dati per estrarre i dati.
Con alcuni trasferimenti di dati shell, la destinazione potrebbe anche dover chiamare il metodo IDataObject::SetData dell'oggetto dati per fornire feedback all'origine sul risultato del trasferimento dei dati.
Al termine dell'oggetto dati, la destinazione restituisce da IDropTarget::D rop. Il sistema restituisce la chiamata DoDragDrop dell'origine per notificare all'origine che il trasferimento dei dati è stato completato.
A seconda dello scenario di trasferimento dati specifico, l'origine potrebbe dover eseguire azioni aggiuntive in base al valore restituito da DoDragDrop e ai valori passati all'oggetto dati dalla destinazione. Ad esempio, quando un file viene spostato, l'origine deve controllare questi valori per determinare se deve eliminare il file originale.
L'origine rilascia l'oggetto dati.
Sebbene le procedure descritte in precedenza forniscano un modello generale valido per il trasferimento dei dati shell, esistono molti tipi diversi di dati che possono essere contenuti in un oggetto dati Shell. Esistono anche diversi scenari di trasferimento dei dati che l'applicazione potrebbe dover gestire. Ogni tipo di dati e scenario richiede un approccio leggermente diverso a tre passaggi chiave della procedura:
Come un'origine costruisce un oggetto dati per contenere i dati della shell.
Come una destinazione estrae i dati della shell dall'oggetto dati.
Come l'origine completa l'operazione di trasferimento dei dati.
L'oggetto dati shell fornisce una discussione generale sul modo in cui un'origine costruisce un oggetto dati Shell e sul modo in cui tale oggetto dati può essere gestito dalla destinazione.
La gestione degli scenari di trasferimento dei dati shell illustra in dettaglio come gestire diversi scenari comuni di trasferimento dei dati shell.