Habilitar e controlar a composição do DWM
As APIs de composição do Desktop Window Manager (DWM) fornecem várias funções para definir e consultar informações básicas usadas pelo DWM. Essas APIs permitem que você consulte e altere o estado da 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 cores 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 cores 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 manipular a mensagem de mudança 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 que o DWM permite 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 desativar ou reativar esses efeitos por motivos de estilo ou compatibilidade. As funções a seguir são usadas para gerenciar a transparência e o comportamento do efeito de transição.
Para recuperar o estado de renderização não cliente atual para a janela de um aplicativo, chame DwmGetWindowAttribute com dwAttribute definido como DWMWA_NCRENDERING_ENABLED. Como você pode ver na documentação de DWMWA_NCRENDERING_ENABLED, quando você passa esse sinalizador para DwmGetWindowAttribute, o valor do atributo recuperado é do tipo BOOL. Sinalizadores diferentes fazem com que DwmGetWindowAttribute retornem valores de tipos diferentes. 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 para esse sinalizador nos diz 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 de 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 os 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 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
Desativando a composição DWM (Windows 7 e versões anteriores)
Advertência
As informações nesta secção aplicam-se apenas ao Windows 7 e sistemas anteriores.
Como o DWM usa a unidade de processamento gráfico (GPU) para composição de desktop, 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 cheia, devem determinar se o DWM está habilitado e, se estiver, desativá-lo. Para fazer isso, duas funções são necessárias.
- DwmIsCompositionEnabled
- DwmEnableComposition
Uma chamada para DwmEnableComposition com fEnable definido como DWM_EC_DISABLECOMPOSITION desativa a composição DWM até que o processo de chamada seja encerrado ou a composição tenha sido reativada chamando DwmEnableComposition com fEnable definido como DWM_EC_ENABLECOMPOSITION. A composição DWM é reiniciada automaticamente assim que todos os aplicativos que desabilitaram a composição são desligados ou reativados manualmente a composição chamando DwmEnableComposition.
Observação
O DWM desativa automaticamente a composição quando um aplicativo tenta desenhar diretamente para a superfície de exibição primária. A composição será desativada até que a superfície principal do dispositivo seja liberada por esse aplicativo.