Memindahkan Objek Shell dengan seret dan lepas dan Clipboard

Banyak aplikasi memungkinkan pengguna untuk mentransfer data ke aplikasi lain dengan menyeret dan menjatuhkan data dengan mouse, atau dengan menggunakan Clipboard. Di antara banyak jenis data yang dapat ditransfer adalah objek Shell seperti file atau folder. Transfer data shell dapat terjadi di antara dua aplikasi, tetapi pengguna juga dapat mentransfer data Shell ke atau dari desktop atau Windows Explorer.

Meskipun file adalah objek Shell yang paling umum ditransfer, transfer data Shell dapat melibatkan objek apa pun dari beragam objek yang ditemukan di namespace Shell. Misalnya, aplikasi Anda mungkin perlu mentransfer file ke folder virtual seperti Keranjang Sampah, atau menerima objek dari ekstensi namespace non-Microsoft. Jika Anda menerapkan ekstensi namespace layanan, ekstensi tersebut harus dapat berfungsi dengan baik sebagai sumber dan target drag-and-drop.

Dokumen ini membahas bagaimana aplikasi dapat menerapkan drag-and-drop dan transfer data Clipboard dengan objek Shell.

Cara Kerja Seret dan Letakkan dengan Objek Shell

Aplikasi sering kali perlu memberi pengguna cara untuk mentransfer data Shell. Beberapa contohnya adalah:

  • Menyeret file dari Windows Explorer atau desktop dan menjatuhkannya pada aplikasi.
  • Menyalin file ke Clipboard di Windows Explorer dan menempelkannya ke dalam aplikasi.
  • Menyeret file dari aplikasi ke Keranjang Sampah.

Untuk diskusi terperinci tentang cara menangani skenario ini dan lainnya, lihat Menangani Skenario Transfer Data Shell. Dokumen ini berfokus pada prinsip umum di balik transfer data Shell.

Windows menyediakan dua cara standar bagi aplikasi untuk mentransfer data Shell:

  • Pengguna memotong atau menyalin data Shell, seperti satu atau beberapa berkas, ke Clipboard. Aplikasi lain mengambil data dari Clipboard.
  • Pengguna menyeret ikon yang mewakili data dari aplikasi sumber dan meletakkan ikon pada jendela yang dimiliki oleh target.

Dalam kedua kasus, data yang ditransfer terkandung dalam objek data. Objek data adalah objek Model Objek Komponen (COM) yang mengekspos antarmuka IDataObject . Secara skema, ada tiga langkah penting yang harus diikuti oleh semua transfer data Shell:

  1. Source membuat objek data yang mewakili data yang akan ditransfer.
  2. Target menerima penunjuk ke antarmuka IDataObject objek data.
  3. Target memanggil antarmuka IDataObject untuk mengekstrak data darinya.

Perbedaan antara transfer data Clipboard dan drag-and-drop terutama terletak pada bagaimana penunjuk IDataObject ditransfer dari sumber ke target.

Transfer Data Papan Klip

Clipboard adalah cara paling sederhana untuk mentransfer data Shell. Prosedur dasar mirip dengan transfer data Clipboard standar. Namun, karena Anda mentransfer penunjuk ke objek data, bukan data itu sendiri, Anda harus menggunakan API clipboard OLE alih-alih API clipboard standar. Prosedur berikut menguraikan cara menggunakan API clipboard OLE untuk mentransfer data Shell dengan Clipboard:

  1. Sumber data membuat objek data untuk menampung data.
  2. Sumber data memanggil OleSetClipboard, yang menempatkan penunjuk ke antarmuka IDataObject objek data di Clipboard.
  3. Target memanggil OleGetClipboard untuk mengambil penunjuk ke antarmuka IDataObject objek data.
  4. Target mengekstrak data dengan memanggil metode IDataObject::GetData .
  5. Dengan beberapa transfer data Shell, target mungkin juga perlu memanggil metode IDataObject::SetData objek data untuk memberikan umpan balik ke objek data tentang hasil transfer data. Lihat Menangani Operasi Pemindahan yang Dioptimalkan untuk contoh jenis operasi ini.

Transfer Data Seret dan Lepas

Meskipun agak lebih kompleks untuk diimplementasikan, transfer data seret dan letakkan memiliki beberapa keuntungan signifikan daripada Clipboard:

  • Transfer drag-and-drop dapat dilakukan dengan gerakan mouse sederhana, membuat operasi lebih fleksibel dan intuitif untuk digunakan daripada Clipboard.
  • Seret dan letakkan memberi pengguna representasi visual operasi. Pengguna dapat mengikuti ikon saat berpindah dari sumber ke target.
  • Operasi seret dan lepas memberi tahu target saat data tersedia.

Operasi seret dan letakkan juga menggunakan objek data untuk mentransfer data. Namun, sumber drop harus menyediakan fungsionalitas di luar yang diperlukan untuk transfer Clipboard:

  • Sumber drop juga harus membuat objek yang mengekspos antarmuka IDropSource . Sistem ini menggunakan IDropSource untuk berkomunikasi dengan sumber saat operasi sedang berlangsung.
  • Objek data seret dan letakkan bertanggung jawab untuk melacak gerakan kursor dan menampilkan ikon untuk mewakili objek data.

Target drop juga harus menyediakan lebih banyak fungsionalitas daripada yang diperlukan untuk menangani transfer Clipboard:

  • Target drop harus menyediakan antarmuka IDropTarget. Ketika kursor berada di atas jendela target, sistem menggunakan IDropTarget untuk memberikan informasi kepada target seperti posisi kursor, dan untuk memberi tahunya ketika data dijatuhkan.
  • Target drop harus mendaftarkan dirinya dengan sistem dengan memanggil RegisterDragDrop. Fungsi ini menyediakan sistem dengan handel ke jendela target dan penunjuk ke antarmuka IDropTarget aplikasi target.

Note

Untuk operasi seret dan letakkan, aplikasi Anda harus menginisialisasi COM dengan OleInitialize, bukan CoInitialize.

 

Prosedur berikut menguraikan langkah-langkah penting yang biasanya digunakan untuk mentransfer data Shell dengan seret dan letakkan:

  1. Target memanggil RegisterDragDrop untuk memberi sistem penunjuk ke antarmuka IDropTarget-nya dan mendaftarkan jendela sebagai target drop.
  2. Saat pengguna memulai operasi seret dan letakkan, sumber membuat objek data dan memulai siklus drag dengan memanggil DoDragDrop.
  3. Ketika kursor berada di atas jendela target, sistem memberi tahu target dengan memanggil salah satu metode IDropTarget target. Sistem memanggil IDropTarget::DragEnter ketika kursor memasuki jendela target, dan IDropTarget::DragOver saat kursor melewati jendela target. Kedua metode menyediakan target drop dengan posisi kursor saat ini dan status tombol pengubah keyboard seperti CTRL atau ALT. Ketika kursor meninggalkan jendela target, sistem memberi tahu target dengan memanggil IDropTarget::DragLeave. Ketika salah satu metode ini selesai, sistem memanggil antarmuka IDropSource untuk meneruskan nilai pengembalian ke sumber.
  4. Ketika pengguna merilis tombol mouse untuk melepaskan data, sistem memanggil metode IDropTarget::Drop target. Di antara parameter metode adalah penunjuk ke antarmuka IDataObject objek data.
  5. target memanggil metode IDataObject::GetData objek data untuk mengekstrak data.
  6. Dengan beberapa transfer data Shell, target mungkin juga perlu memanggil metode IDataObject::SetData milik objek data untuk memberikan umpan balik ke sumber tentang hasil transfer data.
  7. Ketika target selesai dengan objek data, target akan kembali dari IDropTarget::Drop. Sistem mengembalikan kontrol ke pemanggilan DoDragDrop milik sumber untuk memberi tahu sumber bahwa transfer data selesai.
  8. Bergantung pada skenario transfer data tertentu, sumber mungkin perlu mengambil tindakan tambahan berdasarkan nilai yang dikembalikan oleh DoDragDrop dan nilai yang diteruskan ke objek data oleh target. Misalnya, ketika file dipindahkan, sumber harus memeriksa nilai-nilai ini untuk menentukan apakah sumber harus menghapus file asli.
  9. Source melepaskan objek data.

Meskipun prosedur yang diuraikan di atas memberikan model umum yang baik untuk transfer data Shell, ada banyak jenis data yang dapat dimuat dalam objek data Shell. Ada juga sejumlah skenario transfer data berbeda yang mungkin perlu ditangani aplikasi Anda. Setiap jenis dan skenario data memerlukan pendekatan yang agak berbeda untuk tiga langkah utama dalam prosedur:

  • Cara sumber membuat objek data untuk berisi data Shell.
  • Cara target mengekstrak data Shell dari objek data.
  • Bagaimana sumber menyelesaikan operasi transfer data.

Objek Data Shell menyediakan diskusi umum tentang bagaimana sumber membangun objek data Shell, dan bagaimana objek data tersebut dapat ditangani oleh target. Skenario Transfer Data Shell membahas secara rinci cara menangani sejumlah skenario transfer data Shell umum.