共用方式為


How to: 支援工具箱拖放功能

注意事項注意事項

若要將自訂控制項加入至 [工具箱] 中的建議的方式是使用工具箱控制項範本隨附於 Visual Studio 的 10 SDK,其中包括支援拖放。本主題會保留僅供回溯相容性,並使用現有的控制項。

如需有關如何使用範本建立工具箱控制項的詳細資訊,請參閱How to: 建立使用 Windows Form 的工具箱控制項How to: 建立使用 WPF 的工具箱控制項

若要使用 VSPackages 必須實作拖放支援工具箱文件的檢視,例如編輯器或設計工具中的控制項。

根據預設,所有.NET Framework物件衍生自Control自動、 清楚地提供支援,使用工具箱是不需要的控制項和如下所述的程序。 建立設計工具,可以延伸的基本功能。

如需詳細資訊,請參閱 Windows Form 概觀擴充設計階段支援

若要實作基本的拖放功能

  1. 藉由實作提供拖放支援IDropTarget上檢視物件。 這與 OLE 拖放功能,以及控制項的序列化提供的檢視。

    如需有關如何實作拖放功能的詳細資訊,請參閱拖放 (OLE)

    剪貼簿項目或控制項設計工具上置放可以是垂直距離。 有關所支援的標準剪貼簿格式的Visual Studio工具箱,請參閱工具箱 (Visual Studio SDK)。 

  2. 提供的基本實作IVsToolboxUser上的文件檢視介面。

    當使用者嘗試將工具箱控制項拖曳至檢視中, Visual Studio殼層查詢來查看是否它實作的檢視表的 VSPackage IVsToolboxUser介面。

    1. 實作IsSupported傳回S_OK心地工具箱的置放目標支援的格式。 下列範例會檢查資料物件是否以自訂的剪貼簿格式 (CF_CUSTOM_FORMAT) 以及物件是否為 ActiveX 控制項。

      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;
      }
      

      IDE 會檢查這項資訊的檢視] 視窗第一次載入時,以及每次啟動的重設後的 [檢視] 視窗的工具箱 使用者透過 [IDE 的 自訂工具箱對話方塊。 一般而言, 工具箱 並不顯示不支援的 工具箱項目。

      使用者可以設定選項以顯示所有的 [工具箱] 頁面,在任何時間。 如此一來,在環境不會查詢編輯器IsSupported。 如需如何設定使用者可以工具箱透過 IDE 中,請參閱How to: Manipulate Toolbox Tabs

    2. IDropTarget (如上文所述的那一個) 的實作會成功地處理已置放的元件,必須通知 view 物件Visual Studio點撥打這個環境DataUsed 

    如有需要,VSPackage 可以擴充其拖放支援擴充其IVsToolboxUser實作。

  3. IVsToolboxUser實作可支援的拖曳工具箱視窗,以選取項目,而不是滑鼠的動作所要的項目。 使用者可以按兩下上時,也就將某個項目工具箱項目或單獨各按一下並按下 ENTER 鍵。 如要完成這項工作:

    1. 實作 ItemPicked 方法。

      呼叫 ide 的這個方法會選取透過按一下,或是藉由按下 ENTER 鍵。

      此方法,請插入工具箱項目繪製到目標視窗。

    2. 如果您不想支援依選取範圍的實作,該方法必須傳回S_FALSE

      下面的的實作範例ItemPicked方法會檢查,是否選取的物件都有支援,並加以還原如果是這樣序列化它插入程式碼:

      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. 請按照下列步驟來確保適當的重點維護您的應用程式:

    1. 如果您的 [編輯器] 視窗會實作兩個不同的窗格,沒有兩個不同的檢視,然後呼叫UpdateToolboxUI方法,當您切換窗格啟動編輯器視窗內。 只有您知道何時啟用變更,將視窗就會發生。

    2. 若要正確地啟動該視窗,並確定命令路由會更新正確,您必須呼叫Show在元件上的方法。 您會將焦點設定至 [元件] 視窗中,例如拖放作業,牽涉到工具箱] 中所建立或修改編輯器時,必須採取這個動作。

可能需要介入在拖曳作業中,並修改置放的項目,透過 VSPackage IVsToolboxActiveUserHook介面。

舉個例說,而非新增新的工具箱 可明確地控制 工具箱,VSPackage 可能會攔截一種標準 工具箱因為它被丟棄,並取代成自訂的實作。

若要以動態方式修改工具箱控制項

  1. 實作 IVsToolboxActiveUserHook 方法。

    每當工具箱項目被選取,或被丟棄, 工具箱查詢若要查看它是否支援拖放目標IVsToolboxActiveUserHook介面,而且如果它不會呼叫InterceptDataObject方法。

  2. InterceptDataObject方法必須傳回新的IDataObject要使用而不是原始物件IDataObject

    如果置放目標不需要覆寫資料物件,它應該傳回其輸入。

VSPackage 可以允許洏峈循環剪貼簿的內容,按下 CTRL + SHIFT + V 鍵。

若要支援剪貼環

  1. 實作處理常式的CMDIDPasteNextTBXCBItem指令使用:

  2. 命令處理常式中,在實作AreDataObjectsAvailable方法,以判斷是否有任何循環的剪貼簿物件。

    1. 如果工具箱剪貼簿上沒有任何項目,環境會檢查系統剪貼簿],查看它是否有任何項目。

    2. 如果在系統剪貼簿,而不是在 [工具箱] 剪貼簿] 的項目,[剪貼環會填入系統項目。

    3. 若要在清單中選取下一個項目,請實作會呼叫GetAndSelectNextDataObject方法。

    4. 若要返回到 [剪貼簿週期開始,呼叫BeginCycle方法。

請參閱

工作

進階的工具箱控制項開發

概念

How to: 使用 Interop 組件提供自訂工具箱項目

正在註冊工具箱支援功能

管理工具箱

其他資源

工具箱 (Visual Studio SDK)