Compartir a través de


Cómo recortar con un objeto clip de rectángulo

Nota:

En el caso de las aplicaciones de Windows 10, se recomienda usar las API de Windows.UI.Composition en lugar de DirectComposition. Para obtener más información, consulta Modernize your desktop app using the Visual layer (Modernización de la aplicación de escritorio mediante la capa visual).

En este tema se muestra cómo usar un objeto clip de rectángulo para recortar un objeto visual o un árbol visual.

En el ejemplo de este tema se define un clip rectangular centrado en la ubicación del mouse y se aplica el clip a un objeto visual centrado en el área cliente de la ventana de destino de composición. Esta captura de pantalla muestra el resultado de aplicar el objeto clip de rectángulo al objeto visual.

resultado de aplicar un objeto clip de rectángulo a un objeto visual

Lo que necesita saber

Tecnologías

Requisitos previos

  • C/C++
  • Microsoft Win32
  • Modelo de objetos componentes (COM)

Instrucciones

Paso 1: Inicializar objetos DirectComposition

  1. Cree el objeto de dispositivo y el objeto de destino de composición.
  2. Cree un objeto visual, establezca su contenido y agréguelo al árbol visual.

Para obtener más información, vea Cómo inicializar DirectComposition.

Paso 2: Crear el objeto clip de rectángulo

Use el método IDCompositionDevice::CreateRectangleClip para crear una instancia del objeto clip de rectángulo.

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

Paso 3: Establecer las propiedades del objeto clip de rectángulo

Llame a los métodos de la interfaz IDCompositionRectangleClip del objeto clip de rectángulo para establecer las propiedades del rectángulo de recorte.

En el ejemplo siguiente se define un rectángulo de clip centrado alrededor de la ubicación actual del mouse. Las m_offsetX variables de miembro y m_offsetY contienen los valores de las propiedades OffsetX y OffsetY del objeto visual.

    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);
    }

Tenga en cuenta que la interfaz IDCompositionRectangleClip incluye los métodos siguientes para definir un rectángulo de clip que tiene esquinas redondeadas:

Paso 4: Establecer la propiedad Clip del objeto visual

Use el método IDCompositionVisual::SetClip para asociar la propiedad Clip del objeto visual con el objeto clip de rectángulo.

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

Paso 5: Confirmación de la composición

Llame al método IDCompositionDevice::Commit para confirmar el lote de comandos en Microsoft DirectComposition para su procesamiento. El resultado de aplicar el rectángulo de recorte aparece en la ventana de destino.

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

Paso 6: Liberar los objetos DirectComposition

Asegúrese de liberar el objeto clip de rectángulo cuando ya no lo necesite, así como el objeto de dispositivo, el objeto de destino de composición y los objetos visuales. En el ejemplo siguiente se llama a la macro SafeRelease definida por la aplicación para liberar los objetos DirectComposition.

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

Recorte