IDCompositionDevice::CreateTargetForHwnd 方法 (dcomp.h)

创建一个组合目标对象,该对象绑定到由指定的窗口句柄 (HWND) 表示的窗口。

语法

HRESULT CreateTargetForHwnd(
  [in]  HWND                hwnd,
  [in]  BOOL                topmost,
  [out] IDCompositionTarget **target
);

参数

[in] hwnd

类型: HWND

组合目标对象应绑定到的窗口。 此参数不能为 NULL。

[in] topmost

类型: BOOL

如果可视化树应显示在 hwnd 参数指定的窗口的子级之上,则为 TRUE;否则,可视化树显示在子项后面。

[out] target

类型: IDCompositionTarget**

新的组合目标对象。 此参数不能为 NULL。

返回值

类型: HRESULT

如果函数成功,则返回S_OK。 否则,将返回 HRESULT 错误代码。 有关错误代码列表,请参阅 DirectComposition 错误代码。

备注

必须先将 Microsoft DirectComposition 可视化树绑定到窗口,然后才能在屏幕上显示任何内容。 窗口可以是顶级窗口,也可以是子窗口。 在任一情况下,窗口都可以是分层窗口,但在所有情况下,窗口都必须属于调用进程。 如果窗口属于其他进程,则此方法返回 DCOMPOSITION_ERROR_ACCESS_DENIED

将 DirectComposition 内容组合到窗口时,内容始终通过 GetDC 函数或调用 Microsoft DirectX Present 方法返回的设备上下文 (HDC) 直接绘制到该窗口的内容进行组合。 但是,由于窗口剪辑规则适用于 DirectComposition 内容,因此如果窗口具有子窗口,这些子窗口可能会剪裁可视化树。 最 上面的 参数确定子窗口是否剪裁可视化树。

从概念上讲,每个窗口由四个层组成:

  1. 直接绘制到窗口句柄的内容 (这是最底层) 。
  2. 可选的 DirectComposition 可视化树。
  3. 所有子窗口的内容(如果有)。
  4. 另一个可选的 DirectComposition 可视化树 (这是最顶层) 。
所有四个层都剪裁到窗口的可见区域。

最多只能为系统中的每个窗口创建两个组合目标,一个最顶层,一个不是最顶层。 如果组合目标已绑定到指定层上的指定窗口,则此方法将失败。 当合成目标对象被销毁时,它组合的层可供新的合成目标对象使用。

示例

以下示例创建并初始化设备对象,然后将设备对象绑定到组合目标窗口。

#include <dcomp.h>
#include <d3d11.h>

HRESULT InitializeDirectCompositionDevice(HWND hwndTarget, 
        ID3D11Device **ppD3D11Device, IDCompositionDevice **ppDevice,
        IDCompositionTarget **ppCompTarget)
{
    HRESULT hr = S_OK;
    D3D_FEATURE_LEVEL featureLevelSupported;
    IDXGIDevice *pDXGIDevice = nullptr;

    // Verify that the arguments are valid.
    if (hwndTarget == NULL || ppD3D11Device == nullptr || ppDevice == nullptr || 
                            ppCompTarget == nullptr)
    {
        return E_INVALIDARG;
    }

    // Create the D3D device object. Note that the 
    // D3D11_CREATE_DEVICE_BGRA_SUPPORT flag is needed for rendering 
    // on surfaces using Direct2D. 
    hr = D3D11CreateDevice(
        nullptr,
        D3D_DRIVER_TYPE_HARDWARE,
        NULL,
        D3D11_CREATE_DEVICE_BGRA_SUPPORT, // needed for rendering on surfaces using Direct2D
        NULL,
        0,
        D3D11_SDK_VERSION,
        ppD3D11Device,
        &featureLevelSupported,
        NULL);

    if (SUCCEEDED(hr))
    {
        // Create the DXGI device used to create bitmap surfaces.
        hr = (*ppD3D11Device)->QueryInterface(&pDXGIDevice);
    }

    if (SUCCEEDED(hr))
    {
        // Create the DirectComposition device object.
        hr = DCompositionCreateDevice(pDXGIDevice, __uuidof(IDCompositionDevice), 
                reinterpret_cast<void **>(ppDevice));
    }

    if (SUCCEEDED(hr))
    {
        // Bind the DirectComposition device to the target window.
        hr = (*ppDevice)->CreateTargetForHwnd(hwndTarget, TRUE, ppCompTarget);   
    }

    return hr;
}

要求

   
最低受支持的客户端 Windows 8 [仅限桌面应用]
最低受支持的服务器 Windows Server 2012 [仅限桌面应用]
目标平台 Windows
标头 dcomp.h
Library Dcomp.lib
DLL Dcomp.dll

请参阅

组合目标窗口

IDCompositionDevice

IDCompositionTarget

IDCompositionTarget::SetRoot

IDCompositionVisual