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

注意

对于 Windows 10 上的应用,建议使用 Windows.UI.Composition API 而不是 DirectComposition。 有关详细信息,请参阅 使用可视化层实现桌面应用的现代化

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

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

将矩形剪辑对象应用于视觉对象的结果

需要了解的事项

技术

先决条件

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

Instructions

步骤 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);

剪裁