다음을 통해 공유


방법: 도구 상자에서 끌어서 놓기 기능 지원

참고

사용자 지정 컨트롤을 도구 상자에 추가 하는 방법도 포함 Visual Studio 10 SDK와 함께 제공 하는 템플릿을 끌어서 놓기 지원을 컨트롤 도구 상자를 사용 하는 것입니다.이 항목에서는 기존 컨트롤을 사용한 작업 및 이전 버전과 호환성에 대 한 유지 됩니다.

서식 파일을 사용 하 여 도구 상자의 컨트롤 만들기에 대 한 자세한 내용은 참조 하십시오. 방법: Windows Forms을 사용 하는 도구 상자 컨트롤 만들기방법: WPF를 사용 하 여 도구 상자 컨트롤을 만듭니다.

Vspackages를 사용 하면 끌어서 놓기 지원을 구현 해야 도구 상자 컨트롤에서 편집기 또는 디자이너와 같은 문서 보기.

기본적으로 모든 .NET Framework 에서 파생 개체 Control 자동으로 소비에 대 한 지원을 제공 도구 상자 컨트롤 및 아래에 설명 된 절차에서 필요 없는. 디자이너를 작성 하 여 기본 기능을 확장할 수 있습니다.

자세한 내용은 Windows Forms 개요디자인 타임 지원 확장을 참조하십시오.

기본 끌어서 놓기 기능을 구현 하려면

  1. 끌어서 놓기 지원을 구현 하 여 제공 IDropTarget 보기 개체입니다. OLE 끌어서 놓기 기능을 사용 하 고 serialization 컨트롤의 뷰를 제공합니다.

    끌어서 놓기 기능 구현에 대 한 자세한 내용은 끌어서 놓기(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 구현 (예: 위에서 설명 하는 것) 뷰 개체 알려야 합니다 삭제 된 구성 요소를 성공적으로 처리는 Visual Studio 를 호출 하 여이 환경DataUsed 

    원하는 경우 있는 Vspackage가 끌어서 놓기 지원을 확장 하 여 확장할 수 있습니다 해당 IVsToolboxUser 구현 합니다.

  3. IVsToolboxUser 의 드래그 구현을 지원할 수 있습니다 도구 상자 항목 창 마우스 보다는 선택 작업을 합니다. 중 하나를 클릭할 때, 항목을 끌기는 도구 상자 항목 또는 한 번 클릭 한 다음 ENTER 키를 누르면 됩니다. 이를 위해 다음을 수행합니다.

    1. ItemPicked 메서드를 구현합니다.

      IDE에서 호출 합니다.이 메서드는 ENTER 키를 눌러 또는 클릭을 통해 선택 됩니다.

      메서드를 삽입 합니다 있는 도구 상자 항목 대상 창입니다.

    2. 사용자 선택에 의해 구현을 지원 하지 않을 경우, 메서드를 반환 합니다 S_FALSE.

      아래에서의 구현 예제에서는 ItemPicked 메서드 확인 선택한 개체 지원 되지 및이 경우, 코드에 deserialize 하면:

      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 메서드.

참고 항목

작업

고급 도구 상자 컨트롤 개발

개념

방법: Interop 어셈블리를 사용 하 여 사용자 지정 도구 상자 항목을 제공 합니다.

도구 상자 지원 기능을 등록 하는 중

도구 상자를 관리합니다.

기타 리소스

도구 상자 (Visual Studio SDK)