Mentransfer Objek Shell dengan Seret dan Letakkan 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 salah satu dari berbagai 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 layanan non-Microsoft. Jika Anda menerapkan ekstensi namespace layanan, ekstensi tersebut harus dapat bersifat benar sebagai sumber dan target drop.

Dokumen ini membahas bagaimana aplikasi dapat menerapkan transfer data drag-and-drop dan 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 meletakkannya di 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-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 file, ke Clipboard. Aplikasi lain mengambil data dari Clipboard.
  • Pengguna menyeret ikon yang mewakili data dari aplikasi sumber dan menghilangkan 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. Sumber 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 seret dan letakkan terutama terletak pada bagaimana penunjuk IDataObject ditransfer dari sumber ke target.

Transfer Data Clipboard

Clipboard adalah cara paling sederhana untuk mentransfer data Shell. Prosedur dasar mirip dengan transfer data Clipboard standar. Namun, karena Anda mentransfer pointer 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 berisi data.
  2. Sumber data memanggil OleSetClipboard, yang menempatkan penunjuk ke antarmuka IDataObject objek data di Clipboard.
  3. Target memanggil OleGetClipboard untuk mengambil pointer 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.

Seret dan Letakkan Transfer Data

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

  • Transfer seret dan letakkan 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.
  • Seret dan letakkan memberi tahu target saat data tersedia.

Operasi seret dan letakkan juga menggunakan objek data untuk mentransfer data. Namun, sumber penghilangan 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 pergerakan kursor dan menampilkan ikon untuk mewakili objek data.

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

  • Target penurunan harus mengekspos antarmuka IDropTarget . Ketika kursor melebihi jendela target, sistem menggunakan IDropTarget untuk memberikan informasi kepada target seperti posisi kursor, dan untuk memberi tahunya saat data dihilangkan.
  • Target penurunan harus mendaftarkan dirinya dengan sistem dengan memanggil RegisterDragDrop. Fungsi ini menyediakan sistem dengan handel ke jendela target dan penunjuk ke antarmuka IDropTarget aplikasi target.

Catatan

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 dan mendaftarkan jendela sebagai target penurunan.
  2. Saat pengguna memulai operasi seret dan letakkan, sumber membuat objek data dan memulai perulangan seret 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::D ragEnter saat kursor memasuki jendela target, dan IDropTarget::D ragOver 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::D ragLeave. Ketika salah satu metode ini kembali, sistem memanggil antarmuka IDropSource untuk meneruskan nilai yang dikembalikan ke sumber.
  4. Ketika pengguna merilis tombol mouse untuk menghilangkan data, sistem memanggil metode IDropTarget::D rop 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 objek data untuk memberikan umpan balik ke sumber tentang hasil transfer data.
  7. Ketika target selesai dengan objek data, target akan kembali dari IDropTarget::D rop. Sistem mengembalikan panggilan DoDragDrop 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 file asli harus dihapus.
  9. Sumber merilis objek data.

Meskipun prosedur yang diuraikan di atas memberikan model umum yang baik untuk transfer data Shell, ada banyak jenis data berbeda 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:

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

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