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
- Estendendo o quadro de janela para a área do cliente
- Tópicos relacionados
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.
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.
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".
Tópicos relacionados