Compartilhar via


Visão geral do desfoque dwm por trás

Um dos efeitos do DWM (Gerenciador de Janelas da Área de Trabalho) de assinatura é uma área translúcida e não cliente desfocada. As APIs dwm permitem que os aplicativos apliquem esses efeitos à área do cliente de suas janelas de nível superior.

Observação

A edição Windows Vista Home Basic não dá suporte ao efeito de vidro transparente. As áreas que normalmente seriam renderizadas 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 alteração de estilo na forma como as janelas são renderizadas.

 

Este tópico discute os seguintes cenários de desfoque do cliente habilitados pelo DWM.

Adicionando Desfoque a uma região específica da área do cliente

Um aplicativo pode aplicar o efeito de desfoque por trás de toda a região do cliente da janela ou a uma sub-região específica. Isso permite que os aplicativos adicionem caminho estilizado e barras de pesquisa que são visualmente separadas do restante do aplicativo.

A API usada nesse cenário é a função DwmEnableBlurBehindWindow , que usa a estrutura de desfoque de DWM por trás das constantes e do DWM_BLURBEHIND .

A função de exemplo a seguir, EnableBlurBehind, ilustra como aplicar o efeito blur-behind a 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 instrui o DWM a aplicar o desfoque atrás de toda a janela.

A imagem a seguir ilustra o efeito blur-behind aplicado a toda a janela.

o efeito blur-behind aplicado a uma janela

Para aplicar o desfoque por trás de uma sub-região, aplique um HRGN (identificador de região) válido ao membro hRgnBlur da estrutura DWM_BLURBEHIND e adicione o sinalizador DWM_BB_BLURREGION ao membro dwFlags .

Quando você aplica o efeito blur-behind a uma sub-região da janela, o canal alfa da janela é usado para a área não desaplicada. Isso pode causar uma transparência inesperada na região sem interrupção de uma janela. Portanto, tenha cuidado ao aplicar um efeito de desfoque a uma sub-região.

Estendendo o quadro de janela para a área do cliente

Um aplicativo pode estender o desfoque do quadro da janela para a área do 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 restante de um aplicativo. Essa funcionalidade é exposta pela função DwmExtendFrameIntoClientArea .

Para habilitar o desfoque usando DwmExtendFrameIntoClientArea, use a estrutura MARGINS para indicar quanto estender para a á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 blur-behind estendido na parte inferior da área do cliente.

imagem que mostra o efeito blur-behind estendido na parte inferior de uma área do cliente

Também disponível por meio do método DwmExtendFrameIntoClientArea é o efeito "sheet of glass", em que o efeito de desfoque é aplicado a toda a superfície da janela sem uma borda de janela visível. O exemplo a seguir demonstra esse efeito em que 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 da janela "folha de vidro".

imagem que ilustra o efeito blur-behind no estilo da janela

Visão geral do Gerenciador de Janelas da Área de Trabalho

Habilitar e controlar a composição do DWM

Considerações de desempenho e práticas recomendadas