如何使用矩形剪辑对象进行剪辑

注意

对于Windows 10上的应用,我们建议使用Windows。UI。合成 API 而不是 DirectComposition。 有关详细信息,请参阅 使用视觉层现代化桌面应用

本主题演示如何使用矩形剪辑对象来剪辑视觉对象或可视化树。

本主题中的示例定义以鼠标位置为中心的矩形剪辑,并将剪辑应用于以合成目标窗口工作区为中心的视觉对象。 此屏幕截图显示将矩形剪辑对象应用于视觉对象的结果。

result of applying a rectangle clip object to a visual

需要了解的事项

技术

先决条件

  • C/C++
  • Microsoft Win32
  • 组件对象模型 (COM)

说明

步骤 1:初始化 DirectComposition 对象

  1. 创建设备对象和组合目标对象。
  2. 创建视觉对象,设置其内容,并将其添加到可视化树。

有关详细信息,请参阅 如何初始化 DirectComposition

步骤 2:创建矩形剪辑对象

使用 IDCompositionDevice::CreateRectangleClip 方法创建矩形剪辑对象的实例。

    HRESULT hr = S_OK;
    
    // Create the rectangle clip object.
    if (m_pClip == NULL)
    {
        hr = m_pDevice->CreateRectangleClip(&m_pClip);
    }

步骤 3:设置矩形剪辑对象的属性

调用矩形剪辑对象的 IDCompositionRectangleClip 接口的方法以设置剪辑矩形的属性。

以下示例定义以当前鼠标位置为中心的剪辑矩形。 成员m_offsetXm_offsetY变量包含视觉对象的 OffsetX 和 OffsetY 属性的值。

    if (SUCCEEDED(hr))
    {
        // Get the location of the mouse.
        POINT ptMouse = { };
        GetCursorPos(&ptMouse);
        ScreenToClient(m_hwnd, &ptMouse);

        // Create a 100-by-100 pixel rectangular clip that is 
        // centered at the mouse location, and is mapped to
        // the rectangle of the visual.
        m_pClip->SetLeft((ptMouse.x - m_offsetX) - 50.f);
        m_pClip->SetTop((ptMouse.y - m_offsetY) - 50.f);
        m_pClip->SetRight((ptMouse.x - m_offsetX) + 50.f);
        m_pClip->SetBottom((ptMouse.y - m_offsetY) + 50.f);
    }

请注意, IDCompositionRectangleClip 接口包括以下方法,用于定义具有圆角的剪辑矩形:

步骤 4:设置视觉对象的 Clip 属性

使用 IDCompositionVisual::SetClip 方法将视觉对象的 Clip 属性与矩形剪辑对象相关联。

    if (SUCCEEDED(hr))
    {
        // Set the rectangle clip object as the Clip property 
        // of the visual.
        hr = m_pVisual->SetClip(m_pClip);
    }

步骤 5:提交合成

调用 IDCompositionDevice::Commit 方法,将命令批处理提交到 Microsoft DirectComposition 进行处理。 应用剪辑矩形的结果显示在目标窗口中。

    if (SUCCEEDED(hr))
    {
        // Commit the visual to be composed and displayed.
        hr = m_pDevice->Commit();  
    }

步骤 6:释放 DirectComposition 对象

当不再需要矩形剪辑对象以及设备对象、合成目标对象以及任何视觉对象时,请务必释放矩形剪辑对象。 以下示例调用应用程序定义的 SafeRelease 宏来释放 DirectComposition 对象。

    SafeRelease(&m_pClip);
    SafeRelease(&m_pDevice);
    SafeRelease(&m_pD3D11Device);
    SafeRelease(&m_pCompTarget);
    SafeRelease(&m_pVisual);
    SafeRelease(&m_pSurface);

剪裁