Udostępnij przez


Przenoszenie obiektów za pomocą przeciągnij i upuść oraz schowka

Wiele aplikacji umożliwia użytkownikom przesyłanie danych do innej aplikacji przez przeciąganie i upuszczanie danych za pomocą myszy lub przy użyciu Schowka. Wśród wielu typów danych, które mogą być przesyłane, są obiekty Shell, takie jak pliki lub foldery. Transfer danych powłoki może odbywać się między dwiema aplikacjami, ale użytkownicy mogą również przesyłać dane powłoki do lub z pulpitu lub Eksploratora Windows.

Chociaż pliki są najczęściej transferowanym obiektem powłoki, transfer danych powłoki może obejmować dowolny z różnych obiektów znalezionych w przestrzeni nazw Shell. Na przykład aplikacja może wymagać przeniesienia pliku do folderu wirtualnego, takiego jak Kosz, lub zaakceptowania obiektu z rozszerzenia innego niż Microsoft. Jeśli implementujesz rozszerzenie przestrzeni nazw, musi być w stanie zachowywać się prawidłowo jako źródło upuszczania i element docelowy.

W tym dokumencie omówiono, jak aplikacje mogą implementować transfery danych przeciągnij i upuść oraz Schowek z obiektami powłoki systemowej.

Jak działa przeciąganie i upuszczanie z obiektami powłoki

Aplikacje często muszą zapewnić użytkownikom sposób transferu danych interfejsu powłoki. Oto kilka przykładów:

  • Przeciągnięcie pliku z Eksploratora Windows lub pulpitu i upuszczenie go w aplikacji.
  • Kopiowanie pliku do Schowka w Eksploratorze Windows i wklejanie go do aplikacji.
  • Przeciągnięcie pliku z aplikacji do Kosza.

Aby zapoznać się ze szczegółowym omówieniem sposobu obsługi tych i innych scenariuszy, zobacz Obsługa scenariuszy transferu danych powłoki komputerowej. Ten dokument koncentruje się na ogólnych zasadach dotyczących przesyłania danych Shell.

System Windows oferuje dwa standardowe sposoby transferowania danych powłoki przez aplikacje:

  • Użytkownik wycina lub kopiuje dane powłoki systemowej, takie jak jeden lub więcej plików, do Schowka systemowego. Druga aplikacja pobiera dane ze Schowka.
  • Użytkownik przeciąga ikonę reprezentującą dane z aplikacji źródłowej i usuwa ikonę w oknie należącym do obiektu docelowego.

W obu przypadkach transferowane dane są zawarte w obiekcie danych . Obiekty danych to obiekty modelu obiektów składowych (COM), które uwidaczniają interfejs IDataObject. Schematycznie istnieją trzy podstawowe kroki, które muszą wykonać wszystkie transfery danych Shell:

  1. Źródło tworzy obiekt danych reprezentujący dane, które mają być przesyłane.
  2. Obiekt docelowy odbiera wskaźnik do interfejsu IDataObject obiektu danych.
  3. Obiekt docelowy wywołuje interfejs IDataObject w celu wyodrębnienia z niego danych.

Różnica między transferami danych ze schowka a przeciąganiem i upuszczaniem polega głównie na tym, jak wskaźnik IDataObject jest przekazywany ze źródła do celu.

Transfery danych schowka

Schowek to najprostszy sposób przesyłania danych powłoki. Podstawowa procedura jest podobna do standardowego przesyłania danych poprzez Schowek. Jednak ponieważ przesyłasz wskaźnik do obiektu danych, a nie same dane, musisz użyć interfejsu API schowka OLE zamiast standardowego interfejsu API schowka. Poniższa procedura przedstawia sposób użycia interfejsu API schowka OLE do transferu danych powłoki za pomocą Schowka.

  1. Źródło danych tworzy obiekt danych zawierający dane.
  2. Źródło danych wywołuje OleSetClipboard, który umieszcza wskaźnik do interfejsu obiektu danych IDataObject w Schowku.
  3. Obiekt docelowy wywołuje OleGetClipboard, aby pobrać wskaźnik do interfejsuIDataObject obiektu danych.
  4. Obiekt docelowy wyodrębnia dane, wywołując metodę IDataObject::GetData.
  5. W przypadku niektórych transferów danych powłoki obiekt docelowy może również wymagać wywołania metody IDataObject::SetData obiektu danych, aby przekazać obiektowi danych informację zwrotną dotyczącą wyniku transferu. Zobacz Obsługa zoptymalizowanych operacji przenoszenia, aby zapoznać się z przykładem tej operacji.

Transfery danych metodą przeciągnij i upuść

Chociaż implementacja jest nieco bardziej skomplikowana, transfer danych metodą "przeciągnij i upuść" ma pewne znaczące korzyści w stosunku do Schowka:

  • Transfery przeciągania i upuszczania można wykonywać za pomocą prostego ruchu myszy, dzięki czemu operacja jest bardziej elastyczna i intuicyjna do użycia niż Schowek.
  • Przeciąganie i upuszczanie zapewnia użytkownikowi wizualną reprezentację operacji. Użytkownik może obserwować ikonę, gdy przenosi się ze źródła do miejsca docelowego.
  • Przeciąganie i upuszczanie powiadamia cel, gdy dane są dostępne.

Operacje przeciągania i upuszczania używają również obiektów danych do przesyłania danych. Jednak źródło upuszczania musi zapewniać funkcjonalność poza tym, która jest wymagana w przypadku transferów schowka:

  • Źródło upuszczania musi również utworzyć obiekt, który uwidacznia interfejs IDropSource . System używa IDropSource do komunikowania się ze źródłem, gdy operacja jest w toku.
  • Obiekt danych obsługujący przeciąganie i upuszczanie jest odpowiedzialny za śledzenie ruchu kursora oraz wyświetlanie ikony, która reprezentuje obiekt danych.

Miejsca docelowe upuszczania muszą również zapewniać większą funkcjonalność niż jest wymagana do obsługi transferów schowka:

  • Obiekt docelowy upuszczania musi udostępnić interfejs IDropTarget. Gdy kursor znajduje się nad oknem docelowym, system używa IDropTarget, aby przekazać oknu docelowemu informacje, takie jak położenie kursora, oraz powiadomić je, gdy dane zostaną upuszczone.
  • Obiekt docelowy upuszczania musi zarejestrować się w systemie, wywołując RegisterDragDrop. Ta funkcja zapewnia systemowi uchwyt do okna docelowego i wskaźnik do interfejsu IDropTarget aplikacji docelowej.

Notatka

W przypadku operacji przeciągania i upuszczania aplikacja musi zainicjować model COM za pomocą OleInitialize, a nie CoInitialize.

 

Poniższa procedura przedstawia niezbędne kroki, które zwykle stosuje się do transferu danych Shell za pomocą przeciągania i upuszczania.

  1. Obiekt docelowy wywołuje RegisterDragDrop, dając systemowi wskaźnik do interfejsu IDropTarget oraz rejestruje okno jako cel upuszczania.
  2. Gdy użytkownik rozpocznie operację przeciągania i upuszczania, źródło tworzy obiekt danych i inicjuje pętlę przeciągania przez wywołanie DoDragDrop.
  3. Gdy kursor znajduje się nad oknem docelowym, system powiadamia obiekt docelowy, wywołując jedną z metod IDropTarget obiektu docelowego. System wywołuje IDropTarget::DragEnter, gdy kursor wchodzi do okna docelowego, a IDropTarget::DragOver, gdy kursor przemieszcza się nad oknem docelowym. Obie metody dostarczają celowi upuszczania bieżące położenie kursora i stan klawiszy modyfikujących, takich jak CTRL lub ALT. Gdy kursor opuszcza okno docelowe, system powiadamia okno docelowe, wywołując IDropTarget::DragLeave. Gdy którakolwiek z tych metod zwraca, system wywołuje interfejs IDropSource , aby przekazać wartość zwracaną do źródła.
  4. Gdy użytkownik zwolni przycisk myszy, aby zrzucić dane, system wywołuje metodę IDropTarget::Drop. Wśród parametrów metody jest wskaźnik do interfejsu IDataObject obiektu danych.
  5. Obiekt docelowy wywołuje metodę IDataObject::GetDataData, aby wyodrębnić dane.
  6. W przypadku niektórych transferów danych powłoki obiekt docelowy może również wymagać wywołania metody IDataObject::SetData, aby przekazać informację zwrotną do źródła na temat wyniku transferu danych.
  7. Gdy obiekt docelowy zakończy pracę z obiektem danych, zwraca wartość z IDropTarget::Drop. System zwraca wywołanie DoDragDrop, aby powiadomić źródło o zakończeniu transferu danych.
  8. W zależności od konkretnego scenariusza transferu danych źródło może wymagać wykonania dodatkowej akcji na podstawie wartości zwracanej przez DoDragDrop i wartości przekazywanych do obiektu danych przez obiekt docelowy. Na przykład po przeniesieniu pliku źródło musi sprawdzić te wartości, aby określić, czy musi usunąć oryginalny plik.
  9. Źródło zwalnia obiekt danych.

Chociaż opisane powyżej procedury zapewniają dobry ogólny model transferu danych systemu Shell, istnieje wiele różnych typów danych, które mogą być zawarte w obiekcie danych systemu Shell. Istnieje również wiele różnych scenariuszy transferu danych, które aplikacja może wymagać obsługi. Każdy typ danych i scenariusz wymaga nieco innego podejścia do trzech kluczowych kroków procedury:

  • W jaki sposób źródło konstruuje obiekt danych do przechowywania danych powłoki.
  • Jak obiekt docelowy wyodrębnia dane Shell z obiektu danych.
  • Jak źródło kończy operację transferu danych.

Obiekt danych powłoki zawiera ogólne omówienie, jak źródło konstruuje obiekt danych powłoki i jak ten obiekt danych może być obsługiwany przez cel. Obsługa scenariuszy transferu danych powłoki szczegółowo omówiono sposób obsługi wielu typowych scenariuszy transferu danych powłoki.