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 内容,因此如果窗口具有子窗口,这些子窗口可能会剪裁可视化树。 最 上面的 参数确定子窗口是否剪裁可视化树。
从概念上讲,每个窗口由四个层组成:
- 直接绘制到窗口句柄的内容 (这是最底层) 。
- 可选的 DirectComposition 可视化树。
- 所有子窗口的内容(如果有)。
- 另一个可选的 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 |