Partilhar via


Visão geral do DWM Blur Behind

Um dos efeitos característicos do Desktop Window Manager (DWM) é uma área não-cliente translúcida e desfocada. As APIs DWM permitem que os aplicativos apliquem esses efeitos à área do cliente de suas janelas de nível superior.

Observação

O Windows Vista Home Basic edition não suporta o efeito de vidro transparente. As áreas que normalmente renderizariam com o efeito de vidro transparente em outras edições do Windows são renderizadas como opacas. A partir do Windows 8, chamar essa função não resulta no efeito de desfoque, devido a uma mudança de estilo na forma como as janelas são renderizadas.

 

Este tópico discute os seguintes cenários de desfoque de fundo do cliente que o DWM habilita.

Adicionar desfoque a uma região específica da Área do Cliente

Um aplicativo pode aplicar o efeito de desfoque atrás de toda a região do cliente da janela ou a uma sub-região específica. Isso permite que os aplicativos adicionem caminhos com estilo e barras de pesquisa que são visualmente separadas do resto do aplicativo.

A API usada neste cenário é a funçãoDwmEnableBlurBehindWindow, que faz uso do DWM Blur Behind Constants e da estrutura DWM_BLURBEHIND.

A função de exemplo a seguir, EnableBlurBehind, ilustra como aplicar o efeito de desfoque atrás de toda a janela.

HRESULT EnableBlurBehind(HWND hwnd)
{
    HRESULT hr = S_OK;

    // Create and populate the blur-behind structure.
    DWM_BLURBEHIND bb = {0};

    // Specify blur-behind and blur region.
    bb.dwFlags = DWM_BB_ENABLE;
    bb.fEnable = true;
    bb.hRgnBlur = NULL;

    // Enable blur-behind.
    hr = DwmEnableBlurBehindWindow(hwnd, &bb);
    if (SUCCEEDED(hr))
    {
        // ...
    }
    return hr;
}

Observe que NULL é especificado no parâmetro hRgnBlur. Isso diz ao DWM para aplicar o desfoque atrás de toda a janela.

A imagem a seguir ilustra o efeito de desfoque por trás aplicado a toda a janela.

o efeito de desfoque por trás aplicado a uma janela

Para aplicar o desfoque atrás de uma sub-região, deve-se aplicar um identificador de região válido (HRGN) no membro hRgnBlur da estrutura DWM_BLURBEHIND e adicionar o sinalizador DWM_BB_BLURREGION no membro dwFlags.

Quando se aplica o efeito de desfoque atrás a uma subregião da janela, o canal alfa é utilizado na área da janela que não é desfocada. Isso pode causar uma transparência inesperada na região não desfocada de uma janela. Portanto, tenha cuidado ao aplicar um efeito de desfoque em uma sub-região.

Estendendo a moldura da janela para a área do cliente

Uma aplicação pode estender o desfoque da moldura da janela para a área de cliente. Isso é útil quando você aplica o efeito de desfoque atrás de uma janela com uma barra de ferramentas encaixada ou controles visualmente separados do resto de um aplicativo. Essa funcionalidade é exposta pela função DwmExtendFrameIntoClientArea.

Para habilitar o desfoque usando DwmExtendFrameIntoClientArea, utilize a estrutura MARGINS para indicar a extensão a aplicar na área do cliente. A função de exemplo a seguir, ExtendIntoClientBottom, alterna a extensão de desfoque na parte inferior do quadro não cliente para a área do cliente.

HRESULT ExtendIntoClientBottom(HWND hwnd)
{
    HRESULT hr = S_OK;

    // Set the margins, extending the bottom margin.
    MARGINS margins = {0,0,0,25};

    // Extend the frame on the bottom of the client area.
    hr = DwmExtendFrameIntoClientArea(hwnd,&margins);
    if (SUCCEEDED(hr))
    {
        // ...
    }
    return hr;
}

A imagem a seguir ilustra o efeito de desfoque atrás, estendido até à parte inferior da área do utilizador.

imagem que mostra o efeito de desfoque estendido na parte inferior de uma área do cliente

Também disponível através do método DwmExtendFrameIntoClientArea é o efeito "folha de vidro", onde o efeito de desfoque é aplicado a toda a superfície da janela sem uma borda visível da janela. O exemplo a seguir demonstra esse efeito onde a área do cliente é renderizada sem uma borda de janela.

HRESULT ExtendIntoClientAll(HWND hwnd)
{
    HRESULT hr = S_OK;

    // Negative margins have special meaning to DwmExtendFrameIntoClientArea.
    // Negative margins create the "sheet of glass" effect, where the client 
    // area is rendered as a solid surface without a window border.
    MARGINS margins = {-1};

    // Extend the frame across the whole window.
    hr = DwmExtendFrameIntoClientArea(hwnd,&margins);
    if (SUCCEEDED(hr))
    {
        // ...
    }
    return hr;
}

A imagem a seguir ilustra o desfoque atrás no estilo de janela "folha de vidro".

imagem que ilustra o efeito de desfoque de fundo no estilo de janela

Visão geral do Desktop Window Manager

Ativar e controlar a composição do DWM

Considerações de desempenho e práticas recomendadas