如何:使用互操作程序集,提供自定义工具箱项

备注

建议使用此方法的方式将自定义控件添加到工具箱将使用随 Visual Studio 10 SDK 的工具箱控件模板。本主题仅保留以备向后兼容和用于将现有控件添加到工具箱中。

有关使用该模板创建的工具箱控件的更多信息,请参见 如何:创建使用 windows 窗体的一个工具箱控件如何:使用 WPF 创建一个工具箱控件

根据互操作程序集的 VSPackage 可以通过添加 Activex 控件扩展 Visual Studio 工具箱 功能。

有关标准 Visual Studio 工具箱剪贴板格式列表,请参见 工具箱 (Visual Studio SDK)

有关使用 Visual Studio SDK, VSPackage 如何管理 工具箱 的信息,请参见 管理工具箱

有关管理 工具箱 的信息通过自动化,请参见 如何:控制工具箱

过程

项目添加到 工具箱 应实现标准 工具箱 剪贴板格式,除非添加项的 VSPackage 作为 工具箱 项目提供程序 —提供实现为新的布局支持。

实现工具箱控件

  • VSPackage 提供的 工具箱 项目在非托管代码实现必须实现 IDataObject 对象或是 Activex 控件 —从哪个环境中获取 IDataObject 对象。

    有关实现 IDataObject 对象的更多信息 工具箱支持,请参见 IDataObjectTBXITEMINFOFORMATETC

若要添加互操作程序集是基于控件添加到工具箱

  1. 获取的实例:

    1. IVsToolbox2,支持添加控件和部分 (可选) 若要 工具箱 和控件 工具箱 配置的其他方面。

    2. IVsToolbox3,提供本地化和 Visual Studio 设置持久性支持。

    备注

    IVsToolbox2 接口从 IVsToolbox 接口继承。IVsToolbox3IVsToolbox2 不从派生,并执行其方法。

    使用 SID_SVsToolbox,服务标识符IVsToolbox3IVsToolbox2 通过调用 SVsToolbox 服务的 QueryService 方法获取。

    接口 ID IID_IVSToolbox2 用于获取 IVsToolbox2,并且,接口 ID IID_IVSToolbox3 返回 IVsToolbox3

    在以下示例, IVsToolbox2 接口通过调用 IVsToolbox2 接口的 QueryInterface 获取与 QueryServiceIVsToolbox3 接口。

    extern CComModule _Module;
    CComPtr<IVsToolbox2> srpTbx2;
    CComPtr<IVsToolbox3> srpTbx3;
    hr = _Module.QueryService(SID_SVsToolbox, IID_IVsToolbox2, (void**) &srpTbx2));
    hr = srpTbx2->QueryInterface( IID_IVsToolbox3, (void **)&srpTbx3)
    
  2. 使用 IVsToolbox2IVsToolbox3 接口的实例添加选项 (部分) 和控件添加到 工具箱

    使用 AddTab 方法,如以下示例中,一个新的选项卡添加具有本地化的名称。

    因为此本地化名称不固定,非本地化的固定的名称 (在本例 L"HTML") 通过对 SetIDOfTab 方法的调用设置。

    如果工具箱选项已经存在, AddTab2 返回 E_FAIL,,在假定情况下,该选项适当地添加了,在尝试检索具有固定的名称之前。

    如果选项已成功添加了,则 IDataObject基于控件添加到 工具箱;否则返回错误。

    CComBSTR sbstrID;
    hr = srpTbx2->AddTab2((WCHAR*)szwDisplayTabName, *pclsidPackage);
    if ( hr == S_OK) {
        sbstrID =L"HTML";
        hr = srpTbx3->SetIDOfTab( (WCHAR*)szwDisplayTabName, sbstrID);
    }else{
        hr = S_OK;
        hr = srpTbx3->GetIDOfTab( (WCHAR*)szwDisplayTabName, &sbstrID );
        
    }
    if ( hr = S_OK){
        hr=srpTbx2->AddItem(tbxItem, &tinfo, bstrLabel);
    }
    return hr;
    

除了添加到 工具箱 外, VSPackage 配置为 工具箱 数据提供程序,并且可用于扩展拖放支持。 Visual Studio IDE。 这允许任意剪贴板格式显示在 工具箱 和编辑。

配置 VSPackage 为工具箱项提供程序

  1. 注册基于互操作的 VSPackage 作为 工具箱 项目提供程序。

    有关注册为 工具箱 提供程序的更多信息,请参见 注册工具箱支持功能

  2. 为支持自定义 工具箱 剪贴板格式的注册。

    支持不实现任何标准 工具箱 剪贴板格式也不实现自定义 工具箱 剪贴板格式的控件的基于互操作的 VSPackage 必须:

    1. 注册它们支持的工具箱剪贴板格式。 有关更多信息,请参见 注册工具箱支持功能

    2. 创建实现 IVsToolboxDataProviderIVsToolboxDataProvider2 接口的类。

      备注

      在实现 IVsPackage 接口相同的类不应实现 IVsToolboxDataProviderIVsToolboxDataProvider2 接口。

    3. 以编程方式通知工具箱 IVsToolboxDataProviderIVsToolboxDataProvider2 接口的特定实现提供自定义数据布局支持的等效方法RegisterDataProviderRegisterDataProvider

      ,在 VSPackage 变为活动状态时,调用 RegisterDataProvider 方法通常执行在 SetSite 方法的实现或在 OnCreate 处理程序方法。

        CComPtr<IVsToolboxDataProviderRegistry> pTB;
        if (SUCCEEDED (hr = pServiceProvider->QueryService(SID_SVsToolboxDataProviderRegistry, IID_IVsToolboxDataProviderRegistry, (PVOID*)&pTB)) && pTB != NULL)
        {
            CustToolboxDataProvider* pDP = new CustToolboxDataProvider;
            if (pDP)
            {
                pDP->AddRef();
                VSCOOKIE dwDPCookie; //UNDONE: pass NULL instead of ptr to the cookie when RegisterDataProvider allows it.
                pTB->RegisterDataProvider((IVsToolboxDataProvider*)pDP, &dwDPCookie);
                pDP->Release();
            }
            else
            {
                hr = E_OUTOFMEMORY;
            }
        }
      

有关标准 Visual Studio 工具箱 剪贴板格式列表,请参见 工具箱 (Visual Studio SDK)

请参见

任务

高级工具箱控件开发

如何:控制工具箱

概念

注册工具箱支持功能

管理工具箱

其他资源

工具箱 (Visual Studio SDK)

工具箱演练