Habilitar e controlar a composição do DWM
As APIs de composição do DWM (Gerenciador de Janelas da Área de Trabalho) fornecem várias funções para definir e consultar informações básicas usadas pelo DWM. Essas APIs permitem consultar e alterar o estado de composição. Além disso, você pode definir e consultar a política de renderização para diferentes atributos de janela DWM.
Recuperando informações de colorização
A cor da região não cliente de uma janela é determinada pelo tema de cor do sistema atual. O valor de colorização é fornecido por meio das APIs dwm para permitir que seu aplicativo corresponda à interface do usuário do cliente com o tema de cor do sistema.
Para acessar esse valor de colorização e monitorar a alteração de cor, use a função DwmGetColorizationColor e a mensagem WM_DWMCOLORIZATIONCOLORCHANGED .
Este exemplo demonstra como lidar com a mensagem alterada de cor e acessar a nova cor.
...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
DWORD newColorizationColor{ (DWORD)wParam };
BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...
Controlando a renderização de região não cliente
Dois dos efeitos visuais habilitados pelo DWM são a transparência da região não cliente de uma janela e os efeitos de transição. Seu aplicativo pode ter que desabilitar ou reabilitar esses efeitos por motivos de estilo ou compatibilidade. As funções a seguir são usadas para gerenciar o comportamento de efeito de transição e transparência.
Para recuperar o estado atual de renderização não cliente da janela de um aplicativo, chame DwmGetWindowAttribute com dwAttribute definido como DWMWA_NCRENDERING_ENABLED. Como você pode ver na documentação do DWMWA_NCRENDERING_ENABLED, quando você passa esse sinalizador para DwmGetWindowAttribute, o valor do atributo recuperado é do tipo BOOL. Sinalizadores diferentes fazem com que DwmGetWindowAttribute retorne valores de diferentes tipos. Aqui está um exemplo de código.
BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_NCRENDERING_ENABLED,
&isNCRenderingEnabled,
sizeof(isNCRenderingEnabled));
Este próximo exemplo mostra como usar o sinalizador DWMWA_EXTENDED_FRAME_BOUNDS com DwmGetWindowAttribute para recuperar o retângulo de limites de quadro estendido de uma janela. A documentação desse sinalizador informa que o valor do atributo recuperado é do tipo RECT.
RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&extendedFrameBounds,
sizeof(extendedFrameBounds));
Observação
Siga o mesmo padrão de programação mostrado acima quando você chama DwmGetWindowAttribute com sinalizadores para atributos diferentes. O tópico de enumeração DWMWINDOWATTRIBUTE indica, na linha para cada sinalizador, para qual tipo de valor você deve passar um ponteiro no parâmetro pvAttribute para DwmGetWindowAttribute. O parâmetro cbAttribute contém o tamanho, em bytes, desse objeto.
DwmSetWindowAttribute permite que seu aplicativo defina a política de renderização de área não cliente. Essa função também determina como seu aplicativo deve lidar com efeitos de transição DWM.
Este próximo exemplo desabilita a renderização de área não cliente. Isso faz com que todas as chamadas anteriores para DwmEnableBlurBehindWindow ou para DwmExtendFrameIntoClientArea sejam desabilitadas.
HRESULT DisableNCRendering(HWND hWnd)
{
HRESULT hr = S_OK;
DWMNCRENDERINGPOLICY ncrp = DWMNCRP_DISABLED;
// Disable non-client area rendering on the window.
hr = ::DwmSetWindowAttribute(hWnd,
DWMWA_NCRENDERING_POLICY,
&ncrp,
sizeof(ncrp));
if (SUCCEEDED(hr))
{
// ...
}
return hr;
}
Além de controlar a renderização de área não cliente, DwmSetWindowAttribute também pode controlar os efeitos de transição do DWM. Você pode definir o comportamento de transição usando DWMWA_TRANSITIONS_FORCEDISABLED como o parâmetro dwAttribute .
Mensagens
As mensagens a seguir fornecem notificação de eventos DWM. Essas mensagens podem ser usadas para monitorar alterações como alterações de estado de composição e alterações de tema de cor do sistema.
- WM_DWMCOLORIZATIONCOLORCHANGED
- WM_DWMCOMPOSITIONCHANGED
- WM_DWMNCRENDERINGCHANGED
- WM_DWMWINDOWMAXIMIZEDCHANGE
Desabilitando a composição do DWM (Windows 7 e anterior)
Aviso
As informações nesta seção se aplicam somente ao Windows 7 e sistemas anteriores.
Como o DWM usa a GPU (unidade de processamento gráfico) para composição da área de trabalho, seu aplicativo pode ter que desabilitar o DWM para compatibilidade. Os aplicativos que assumem o controle total da área de trabalho, como jogos executados no modo de tela inteira, devem determinar se o DWM está habilitado e, se estiver, desabilitá-lo. Para fazer isso, duas funções são necessárias.
Uma chamada para DwmEnableComposition com fEnable definida como DWM_EC_DISABLECOMPOSITION desabilita a composição dwm até que o processo de chamada seja desligado ou a composição tenha sido reabilitada chamando DwmEnableComposition com fEnable definido como DWM_EC_ENABLECOMPOSITION. A composição do DWM é reiniciada automaticamente assim que todos os aplicativos que desabilitaram a composição foram desligados ou reabilitaram manualmente a composição chamando DwmEnableComposition.
Observação
O DWM desabilita automaticamente a composição quando um aplicativo tenta desenhar diretamente para a superfície de exibição primária. A composição será desabilitada até que a superfície do dispositivo primário seja liberada por esse aplicativo.