Compartilhar via


Como cortar com um objeto de clipe de retângulo

Observação

Para aplicativos em Windows 10, recomendamos usar APIs Windows.UI.Composition em vez de DirectComposition. Para obter mais informações, consulte Modernizar seu aplicativo da área de trabalho usando a camada Visual.

Este tópico demonstra como usar um objeto de clipe de retângulo para cortar uma árvore visual ou visual.

O exemplo neste tópico define um clipe retangular centralizado no local do mouse e aplica o clipe a um visual centralizado na área do cliente da janela de destino de composição. Esta captura de tela mostra o resultado da aplicação do objeto de clipe de retângulo ao visual.

resultado da aplicação de um objeto de clipe de retângulo a um visual

O que você precisa saber

Tecnologias

Pré-requisitos

  • C/C++
  • Microsoft Win32
  • COM (Component Object Model)

Instruções

Etapa 1: Inicializar objetos DirectComposition

  1. Crie o objeto do dispositivo e o objeto de destino de composição.
  2. Crie um visual, defina seu conteúdo e adicione-o à árvore visual.

Para obter mais informações, consulte Como inicializar o DirectComposition.

Etapa 2: Criar o objeto de clipe de retângulo

Use o método IDCompositionDevice::CreateRectangleClip para criar uma instância do objeto de clipe do retângulo.

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

Etapa 3: Definir as propriedades do objeto de clipe de retângulo

Chame os métodos da interface IDCompositionRectangleClip do objeto de clipe do retângulo para definir as propriedades do retângulo de clipe.

O exemplo a seguir define um retângulo de clipe centralizado em torno do local atual do mouse. As m_offsetX variáveis membro e m_offsetY contêm os valores das propriedades OffsetX e OffsetY do 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);
    }

Observe que a interface IDCompositionRectangleClip inclui os seguintes métodos para definir um retângulo de clipe que tem cantos arredondados:

Etapa 4: Definir a propriedade Clip do visual

Use o método IDCompositionVisual::SetClip para associar a propriedade Clip do visual ao objeto de clipe retângulo.

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

Etapa 5: Confirmar a composição

Chame o método IDCompositionDevice::Commit para confirmar o lote de comandos no Microsoft DirectComposition para processamento. O resultado da aplicação do retângulo de clipe aparece na janela de destino.

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

Etapa 6: Liberar os objetos DirectComposition

Certifique-se de liberar o objeto de clipe do retângulo quando você não precisar mais dele, bem como o objeto do dispositivo, o objeto de destino de composição e quaisquer objetos visuais. O exemplo a seguir chama a macro SafeRelease definida pelo aplicativo para liberar os objetos DirectComposition.

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

Recortando