Freigeben über


Gewusst wie: Unterstützen von toolbox-Drag & Drop-Funktionalität

Hinweis

Es wird empfohlen, benutzerdefinierte Steuerelement der Toolbox hinzufügen, die Toolbox-Steuerelementvorlagen zu verwenden, die mit dem Visual Studio 10 SDK stammen, die Drag & Drop-Unterstützung einschließen.In diesem Thema wird nur aus Gründen der Abwärtskompatibilität und für die Arbeit mit vorhandenen Steuerelementen beibehalten.

Weitere Informationen zum Erstellen von Toolbox Steuerelemente, indem Sie die Vorlagen verwenden, finden Sie unter Gewusst wie: Erstellen Sie ein Toolbox-Steuerelement, die Windows Forms verwendet und Gewusst wie: Erstellen Sie ein Toolbox-Steuerelement, die WPF verwendet.

Drag & Drop VSPackages muss implementiert werden, wenn sie Toolbox Steuerelemente in Dokumenten und Ansichten, wie Editoren und Designern zu verwenden sind.

Standardmäßig unterstützen alle .NET Framework-Objekte, die von Control automatisch und abgeleitet sind transparent, Unterstützung für das Verarbeiten von Toolbox-Steuerelementen und Prozeduren, die im Folgenden beschrieben sind, sind nicht erforderlich. Die grundlegende Funktionalität kann erweitert werden, indem ein Designer erstellt.

Weitere Informationen finden Sie unter Übersicht über Windows Forms und Erweitern der Entwurfszeitunterstützung.

So implementieren Sie die Drag & Drop-Funktionalität grundlegende

  1. Gewähren Sie Drag & Drop-Unterstützung, indem Sie IDropTarget für ein Ansichtsobjekt implementieren. Dies stellt die Ansicht mit OLE-Drag & Drop-Funktionalität und Serialisierung des Steuerelements.

    Weitere Informationen über das Implementieren von Drag & Drop-Funktionalität finden Sie unter Drag & Drop (OLE).

    Liste können entweder die Zwischenablage oder Steuerelementen Elemente, die in einem Designer verworfen werden. Weitere Informationen zur standardmäßigen zwischenablageformate, die von Visual Studio Toolboxunterstützt werden, finden Sie unter Toolbox (Visual Studio SDK).

  2. Erstellen Sie eine grundlegende Implementierung der IVsToolboxUser-Schnittstelle für eine Ansicht zu Dokumenten bereit.

    Wenn ein Benutzer versucht, ein Toolbox die Steuerung an eine Ansicht zu ziehen, die Visual Studio Shell VSPackages der Sicht abfragen, um festzustellen, wenn die IVsToolboxUser-Schnittstelle implementiert.

    1. Implementieren IsSupported , um S_OK für diese Toolbox Formate zurückzugeben, die das Ablageziel unterstützt. Das Beispiel unter der Überprüft, ob das Datenobjekt im benutzerdefinierten Zwischenablageformat (CF_CUSTOM_FORMAT) ist und ob das Objekt ein ActiveX-Steuerelement handelt.

      STDMETHODIMP CustTbxUser::IsSupported(IDataObject* pDO)
      {
          HRESULT hr;
          STGMEDIUM stm;
          if (!pDO)
          return E_POINTER;
          // Determine if the data object is in the Custom clip board format
          // fetc is the dialog editor toolbox item template.
          FORMATETC fetc = { 
            m_CF_CUSTOM_FORMAT, //Value set with RegisterClipboardFormat
            NULL, 
            DVASPECT_CONTENT, // DVASCPECT_ICON might be better
            -1, 
            TYMED_HGLOBAL 
          };
          if (FAILED(hr = pDO->GetData(&fetc, &stm)))
          {
              // Determine if the object is in the class-id clipboard format ... this
              // would be the case if the control is an activeX toolbox item.
              FORMATETC xfetc = 
              { 
                m_CF_CLSID,
                NULL, 
                DVASPECT_CONTENT, // DVASCPECT_ICON might be better
                -1, 
                TYMED_HGLOBAL 
              };
              if (SUCCEEDED(hr = pDO->GetData(&xfetc,&stm)))
              {
                  USES_CONVERSION;
                  GUID guid;
                  LPSTR pData = (LPSTR)GlobalLock(stm.hGlobal);
                  if (pData)
                  {
                      // Convert from the string format to a binary GUID.
                      if (CLSIDFromString(A2W(pData), &guid) != S_OK)
                          return E_FAIL;
      
                      // HTML data objects could have CLSID format ... so any data object could 
                      // be returned as a NULL guid ... fail on null guid, obviously they are 
                      // not active X controls.
                      if (guid == GUID_NULL)
                          return E_FAIL;
                  }
              }    
          }
      
          return hr;
      }
      

      Die IDE-Überprüfungen Informationen zu dieser Ansicht des Fensters beim ersten Laden und für jede Aktivierung des Fensters einer Ansicht, die eine Toolbox Zurücksetzen von einem Benutzer im Dialogfeld AnpassenToolbox der IDE folgt. In der Regel wird Toolbox keine nicht unterstützten Toolboxelemente an.

      Benutzer können eine Option fest, um alle Seiten Toolbox immer angezeigt werden. In diesem Fall fragt die Umgebung nicht den Editor für IsSupportedab. Informationen dazu, wie ein Benutzer Toolbox von der IDE konfiguriert werden kann, finden Sie unter How to: Manipulate Toolbox Tabs.

    2. Nachdem eine IDropTarget Implementierung (z. B. die oben beschrieben) erfolgreich eine zurückgestellte Komponente behandelt, muss das Ansichtsobjekt die Visual Studio Umgebung aus diesem benachrichtigen, indem DataUsedaufruft 

    Wenn es erwünscht ist, kann ein VSPackage über Drag & Drop-Unterstützung erweitern, indem Sie seine IVsToolboxUser Implementierung erweitert.

  3. Eine IVsToolboxUser Implementierung kann das Ziehen von Toolboxelementen in einem Fenster durch Auswahl statt Mausaktion unterstützen. Das heißt, ein Element zu ziehen, wenn ein Benutzer in einem Toolboxelement oder Einzelklicken und dann die EINGABETASTE drückt, doppelklicken Sie auf die Datei. Gehen Sie dazu wie folgt vor:

    1. Implementieren Sie die ItemPicked-Methode.

      Diese Methode namens von der IDE wird durch einen Klick ausgewählt oder indem Sie die EINGABETASTE drückt.

      Die Methode sollte das Toolboxelement in das Zielfenster einfügen.

    2. Wenn Sie keine Implementierung durch Auswahl nicht unterstützt werden soll, sollte die Methode S_FALSEzurückgeben.

      Im nachfolgenden Beispiel wird die Implementierung der ItemPicked-Methoden überprüft, wenn das ausgewählte Objekt unterstützt wird und wenn sie so in den Code deserialisiert:

      STDMETHODIMP CustTbxUser::ItemPicked(IDataObject* pDataObject)
      {
          if (!pDataObject)
              return E_POINTER;
      
          UINT nIDTool;
          if (IsSupported(pDataObject) == S_OK)
          {
              SetToolCursor();
              m_pDataObject = pDataObject;
              nIDTool = DeserializeObject();
              // Get the focus back
              m_pResObject->m_spWndFrame->Show();
              return S_OK;
          }
      }
      
  4. Führen Sie die folgenden Schritte durch, um sicherzustellen, dass richtiger Fokus für die Anwendung beibehalten werden:

    1. Wenn das Editorfenster über zwei verschiedene Bereiche implementiert, rufen nicht zwei verschiedene Ansichten, die UpdateToolboxUI-Methode auf, wenn Sie aktivierungen Bereichs innerhalb des Editorfensters wechseln. Nur Sie wissen, wann Änderungen innerhalb des Fensters Benachrichtigung erfolgen.

    2. Um das Fenster ordnungsgemäß zu aktivieren und sicherzustellen, dass Befehls routing ordnungsgemäß aktualisiert wird, muss die Show-Methode der Komponente aufrufen. Diese Aktion ausgeführt werden muss, wenn Sie den Fokus auf ein Teil eines Editor festlegen, wie im Fenster erstellt oder ein Drag & Drop-Vorgang geändert, die die Toolbox enthält.

VSPackage muss möglicherweise in einen Ziehvorgang intervenieren und das abgelegte Element über die Schnittstelle IVsToolboxActiveUserHook ändern.

Beispielsweise anstatt ein neues Toolbox-Steuerelement explizit ToolboxBeim Hinzufügen Toolbox abfangen kann ein VSPackage standardmäßigen ersetzen, während es gelöscht wird und diese durch eine benutzerdefinierte Implementierung.

So Toolbox Steuerelemente dynamisch ändern

  1. Implementieren Sie die IVsToolboxActiveUserHook-Methode.

    Sobald ein Toolboxelement ausgewählt oder verworfen wird, die Toolbox-Abfragen Ablageziel, wenn die IVsToolboxActiveUserHook-Schnittstelle unterstützt, wenn keine Aufrufe die InterceptDataObject-Methode übernimmt.

  2. Die Methode muss InterceptDataObject statt ein neues IDataObjectursprüngliche Objekt zurückgegeben IDataObject verwendet werden soll.

    Wenn das Ablageziel nicht das Datenobjekt zu überschreiben, sollte es seine Eingabe zurückgeben.

VSPackage können Benutzer auf den Zyklus ermöglichen durch den Inhalt der Zwischenablage, indem STRG+UMSCHALT+V drückt.

So fügen Sie einen Zwischenablagering unterstützen

  1. Implementieren Sie einen Handler für den CMDIDPasteNextTBXCBItem Befehl mit:

  2. Im Befehlshandler implementieren Sie die AreDataObjectsAvailable-Methode, um zu bestimmen, ob Zwischenablage Objekte in den Zyklus von vorhanden ist.

    1. Wenn keine Elemente auf der Toolbox-Zwischenablage gibt, dann überprüft die Umgebung die Systemzwischenablage, um zu überprüfen, ob für Elemente vorhanden sind.

    2. Wenn Elemente in der Zwischenablage des Systems, nicht jedoch in der Toolbox-Zwischenablage vorhanden ist, wird der Zwischenablagering System mit Elementen aufgefüllt.

    3. Um das nächste Element in der Liste auszuwählen, ruft die Implementierung der GetAndSelectNextDataObject-Methode veranschaulicht.

    4. Um zum Start zurückzukehren zyklus der Zwischenablage, rufen Sie die BeginCycle-Methode auf.

Siehe auch

Aufgaben

Erweiterte Toolbox-Steuerentwicklung

Konzepte

Gewusst wie: Erstellen Sie benutzerdefinierte Toolboxelemente für die Verwendung von Interop-Assemblys bereit

Registrieren von Toolbox-Stütz

Die Toolbox verwalten

Weitere Ressourcen

Toolbox (Visual Studio SDK)