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 desfocagem a uma região específica da área do cliente
- Estendendo a moldura da janela para a área do cliente
- Tópicos relacionados
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.
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.
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".
Tópicos relacionados
-
Visão geral do Desktop Window Manager