Compartilhar via


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.

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.