Drag & Drop (OLE)

Das Drag-and-Drop-Feature von OLE ist in erster Linie eine Verknüpfung zum Kopieren und Einfügen von Daten. Wenn Sie die Zwischenablage zum Kopieren oder Einfügen von Daten verwenden, sind eine Reihe von Schritten erforderlich. Sie wählen die Daten aus, und wählen Sie im Menü "Bearbeiten" die Option "Ausschneiden" oder "Kopieren" aus. Wechseln Sie dann zur Ziel-App oder zum Zielfenster, und platzieren Sie den Cursor an der Zielposition. Schließlich wählen Sie im Menü "Einfügen bearbeiten"> aus.

Das OLE-Drag-and-Drop-Feature unterscheidet sich vom Drag-and-Drop-Mechanismus des Datei-Managers. Der Datei-Manager kann nur Dateinamen verarbeiten und ist speziell für das Übergeben von Dateinamen an Anwendungen konzipiert. Ziehen und Ablegen in OLE ist viel allgemeiner. Damit können Sie alle Daten ziehen und ablegen, die auch in der Zwischenablage platziert werden können.

Wenn Sie OLE-Ziehen und -Ablegen verwenden, entfernen Sie zwei Schritte aus dem Prozess. Sie wählen die Daten aus dem Quellfenster (die "Dropquelle") aus, und ziehen Sie sie dann an das Ziel (das "Dropziel"). Sie legen sie ab, indem Sie die Maustaste loslassen. Der Vorgang beseitigt die Notwendigkeit von Menüs und ist schneller als die Kopier-/Einfügesequenz. Es gibt nur eine Anforderung: Sowohl die Drop-Quelle als auch das Drop-Ziel müssen geöffnet sein und zumindest teilweise auf dem Bildschirm sichtbar sein.

Mithilfe von OLE-Ziehen und -Ablegen können Daten von einer Stelle an eine andere übertragen werden: Innerhalb eines Dokuments, zwischen verschiedenen Dokumenten oder zwischen Anwendungen. Sie kann entweder in einem Container oder in einer Serveranwendung implementiert werden. Jede Anwendung kann eine Dropquelle, ein Dropziel oder beides sein. Wenn eine Anwendung sowohl drop-source- als auch Drop-Target-Unterstützung implementiert, können Sie zwischen untergeordneten Fenstern oder innerhalb eines Fensters ziehen und ablegen. Dieses Feature erleichtert die Verwendung Ihrer Anwendung.

In den Artikeln "Data objects and data sources" (OLE) wird erläutert, wie die Datenübertragung in Ihren Anwendungen implementiert wird. Es ist auch hilfreich, die MFC OLE-Beispiele OCLIENT und HIERSVR zu untersuchen.

Implementieren einer Drop-Quelle

Um Ihre Anwendung abzurufen, um Daten für einen Drag-and-Drop-Vorgang bereitzustellen, implementieren Sie eine Drop-Quelle. Die einfache Implementierung einer Drop-Quelle ist relativ einfach. Der erste Schritt besteht darin, zu bestimmen, welche Ereignisse mit einem Ziehvorgang beginnen. Empfohlene Richtlinien für die Benutzeroberfläche definieren den Anfang eines Ziehvorgangs so, als wenn ein WM_LBUTTONDOWN Ereignis an einem Punkt innerhalb einiger ausgewählter Daten auftritt. Die MFC OLE-Beispiele OCLIENT und HIERSVR befolgen diese Richtlinien.

Wenn ihre Anwendung ein Container ist und die ausgewählten Daten ein verknüpftes oder eingebettetes Objekt vom Typ COleClientItemsind, rufen Sie die DoDragDrop Memberfunktion auf. Erstellen Sie andernfalls ein COleDataSource Objekt, initialisieren Sie es mit der Auswahl, und rufen Sie die Memberfunktion des Datenquellenobjekts DoDragDrop auf. Wenn Ihre Anwendung ein Server ist, verwenden Sie COleServerItem::DoDragDrop. Informationen zum Anpassen des standardmäßigen Drag-and-Drop-Verhaltens finden Sie im Abschnitt " Ziehen und Ablegen anpassen".

Wenn DoDragDrop DROPEFFECT_MOVE zurückgegeben wird, löschen Sie die Quelldaten sofort aus dem Quelldokument. Kein anderer Rückgabewert hat DoDragDrop auswirkungen auf eine Dropquelle.

Weitere Informationen finden Sie unter OLE-Datenobjekte und -datenquellen: Erstellung und Zerstörung sowie OLE-Datenobjekte und -datenquellen: Manipulation.

Implementieren eines Drop-Ziels

Es dauert etwas mehr Arbeit, um ein Drop-Ziel als eine Dropquelle zu implementieren, aber es ist immer noch relativ einfach.

So implementieren Sie ein OLE-Dropziel

  1. Wenn sie noch nicht vorhanden ist, fügen Sie einen Aufruf AfxOleInit in der Memberfunktion Ihrer Anwendung InitInstance hinzu. Dieser Aufruf ist erforderlich, um die OLE-Bibliotheken zu initialisieren.

  2. Fügen Sie jeder Ansicht in der Anwendung, die Sie als Dropziel verwenden möchten, eine Membervariable hinzu. Diese Membervariable muss vom Typ COleDropTarget oder einer von ihr abgeleiteten Klasse sein.

  3. Rufen Sie in der Ansichtsklasse-Funktion, die die WM_CREATE Nachricht (in der Regel OnCreate) behandelt, die Memberfunktion der neuen Membervariable Register auf. Revoke wird automatisch für Sie aufgerufen, wenn Ihre Ansicht zerstört wird.

  4. Überschreiben Sie die folgenden Funktionen. Wenn Sie dasselbe Verhalten in der gesamten Anwendung wünschen, setzen Sie diese Funktionen in Ihrer Ansichtsklasse außer Kraft. Wenn Sie das Verhalten in isolierten Fällen ändern oder das Ablegen auf Nicht-FensternCView aktivieren möchten, überschreiben Sie diese Funktionen in ihrer COleDropTargetabgeleiteten Klasse.

    Außer Kraft setzen So erlauben Sie
    OnDragEnter Drop-Vorgänge, die im Fenster auftreten sollen. Wird aufgerufen, wenn der Cursor das Fenster zum ersten Mal eingibt.
    OnDragLeave Spezielles Verhalten, wenn der Ziehvorgang das angegebene Fenster verlässt.
    OnDragOver Drop-Vorgänge, die im Fenster auftreten sollen. Wird aufgerufen, wenn der Cursor über das Fenster gezogen wird.
    OnDrop Die Verarbeitung von Daten, die im angegebenen Fenster abgelegt werden.
    OnScrollBy Spezielles Verhalten beim Scrollen im Zielfenster.

Siehe MAINVIEW. CPP-Datei, die Teil des MFC OLE-Beispiel-OCLIENT ist, um ein Beispiel dafür zu geben, wie diese Funktionen zusammenarbeiten.

Weitere Informationen finden Sie unter OLE-Datenobjekte und -datenquellen: Erstellung und Zerstörung sowie OLE-Datenobjekte und -datenquellen: Manipulation.

Anpassen von Ziehen und Ablegen

Die Standardimplementierung des Drag-and-Drop-Features reicht für die meisten Anwendungen aus. Einige Anwendungen erfordern jedoch möglicherweise, dass Sie dieses Standardverhalten ändern. In diesem Abschnitt werden die Schritte erläutert, die zum Ändern dieser Standardwerte erforderlich sind. Sie können diese Technik verwenden, um Anwendungen zu erstellen, die keine zusammengesetzten Dokumente in Dropquellen unterstützen.

Wenn Sie das standardmäßige OLE-Drag-and-Drop-Verhalten anpassen oder über eine Nicht-OLE-Anwendung verfügen, müssen Sie ein COleDataSource Objekt erstellen, das die Daten enthält. Wenn der Benutzer einen Drag-and-Drop-Vorgang startet, sollte der Code die DoDragDrop Funktion von diesem Objekt anstelle anderer Klassen aufrufen, die Drag-and-Drop-Vorgänge unterstützen.

Optional können Sie ein COleDropSource Objekt erstellen, um das Ablegen zu steuern und einige seiner Funktionen abhängig vom Typ des Verhaltens, das Sie ändern möchten, außer Kraft zu setzen. Dieses Drop-Source-Objekt wird dann übergeben, um COleDataSource::DoDragDrop das Standardverhalten dieser Funktionen zu ändern. Diese verschiedenen Optionen ermöglichen eine große Flexibilität bei der Unterstützung von Drag-and-Drop-Vorgängen in Ihrer Anwendung. Weitere Informationen zu Datenquellen finden Sie im Artikel "Data Objects and Data Sources (OLE)".

Sie können die folgenden Funktionen überschreiben, um Drag-and-Drop-Vorgänge anzupassen:

Außer Kraft setzen So passen Sie
OnBeginDrag Wie der Ziehvorgang nach dem Aufruf DoDragDropbeginnt.
GiveFeedback Visuelles Feedback, z. B. die Cursordarstellung, für unterschiedliche Drop-Ergebnisse.
QueryContinueDrag Das Beenden eines Drag-and-Drop-Vorgangs. Mit dieser Funktion können Sie während des Ziehvorgangs Zusatztastenzustände überprüfen.

Siehe auch

OLE
OLE-Datenobjekte und Datenquellen
OLE-Datenobjekte und Datenquellen: Erstellung und Zerstörung
OLE-Datenobjekte und Datenquellen: Manipulation
COleClientItem::D oDragDrop
COleDataSource-Klasse
COleDataSource::D oDragDrop
COleDropSource-Klasse
COleDropTarget-Klasse
CView::OnDragLeave