Поделиться через


Метод IDCompositionDevice::CreateTargetForHwnd (dcomp.h)

Создает целевой объект композиции, привязанный к окну, представленному указанным дескриптором окна (HWND).

Синтаксис

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

Параметры

[in] hwnd

Тип: HWND

Окно, к которому должен быть привязан целевой объект композиции. Этот параметр не должен иметь значение NULL.

[in] topmost

Тип: BOOL

Значение TRUE, если визуальное дерево должно отображаться поверх дочерних элементов окна, указанного параметром hwnd ; в противном случае визуальное дерево отображается за дочерними элементами.

[out] target

Тип: IDCompositionTarget**

Новый целевой объект композиции. Этот параметр не должен иметь значение NULL.

Возвращаемое значение

Тип: HRESULT

Если функция завершается успешно, она возвращает S_OK. В противном случае возвращается код ошибки HRESULT . Список кодов ошибок см. в разделе Коды ошибок DirectComposition .

Комментарии

Визуальное дерево Microsoft DirectComposition должно быть привязано к окну, прежде чем что-либо можно будет отобразить на экране. Окно может быть окном верхнего уровня или дочерним окном. В любом случае окно может быть многослойным, но во всех случаях окно должно принадлежать вызывающей процедуре. Если окно принадлежит другому процессу, этот метод возвращает DCOMPOSITION_ERROR_ACCESS_DENIED.

Когда содержимое DirectComposition состоит в окне, содержимое всегда создается поверх всего, что обращается непосредственно к окну через контекст устройства (HDC), возвращаемый функцией GetDC , или посредством вызовов методов Microsoft DirectX Present . Однако, поскольку правила обрезки окон применяются к содержимому 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
Header dcomp.h
Библиотека Dcomp.lib
DLL Dcomp.dll

См. также раздел

Окно целевого объекта композиции

IDCompositionDevice

IDCompositionTarget

IDCompositionTarget::SetRoot

IDCompositionVisual