Partager via


Activer et contrôler la composition DWM

Les API de composition desktop Window Manager (DWM) fournissent plusieurs fonctions pour définir et interroger les informations de base utilisées par le DWM. Ces API vous permettent d’interroger et de modifier l’état de composition. En outre, vous pouvez définir et interroger la stratégie de rendu pour différents attributs de fenêtre DWM.

Récupération des informations de colorisation

La couleur de la région non cliente d’une fenêtre est déterminée par le thème de couleur système actuel. La valeur de colorisation est fournie via les API DWM pour permettre à votre application de faire correspondre l’interface utilisateur cliente au thème de couleur système.

Pour accéder à cette valeur de colorisation et surveiller le changement de couleur, utilisez la fonction DwmGetColorizationColor et le message WM_DWMCOLORIZATIONCOLORCHANGED .

Cet exemple montre comment gérer le message de changement de couleur et accéder à la nouvelle couleur.

...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
    DWORD newColorizationColor{ (DWORD)wParam };
    BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...

Contrôle du rendu des régions non clientes

Deux des effets visuels activés par DWM sont la transparence de la région non cliente d’une fenêtre et les effets de transition. Votre application devra peut-être désactiver ou réactiver ces effets pour des raisons de style ou de compatibilité. Les fonctions suivantes sont utilisées pour gérer le comportement de transparence et d’effet de transition.

Pour récupérer l’état de rendu non client actuel pour la fenêtre d’une application, appelez DwmGetWindowAttribute avec dwAttribute défini sur DWMWA_NCRENDERING_ENABLED. Comme vous pouvez le voir dans la documentation de DWMWA_NCRENDERING_ENABLED, lorsque vous passez cet indicateur à DwmGetWindowAttribute, la valeur de l’attribut récupéré est de type BOOL. Selon les indicateurs, DwmGetWindowAttribute retourne des valeurs de types différents. Voici un exemple de code :

BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
    DWMWA_NCRENDERING_ENABLED,
    &isNCRenderingEnabled,
    sizeof(isNCRenderingEnabled));

Cet exemple suivant montre comment utiliser l’indicateur DWMWA_EXTENDED_FRAME_BOUNDS avec DwmGetWindowAttribute pour récupérer le rectangle de limites de cadre étendu d’une fenêtre. La documentation de cet indicateur nous indique que la valeur de l’attribut récupéré est de type RECT.

RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
    DWMWA_EXTENDED_FRAME_BOUNDS,
    &extendedFrameBounds,
    sizeof(extendedFrameBounds));

Notes

Suivez le même modèle de programmation que celui indiqué ci-dessus lorsque vous appelez DwmGetWindowAttribute avec des indicateurs pour différents attributs. La rubrique d’énumération DWMWINDOWATTRIBUTE indique, dans la ligne de chaque indicateur, le type de valeur vers lequel vous devez passer un pointeur dans le paramètre pvAttribute pour DwmGetWindowAttribute. Le paramètre cbAttribute contient la taille, en octets, de cet objet.

DwmSetWindowAttribute permet à votre application de définir la stratégie de rendu de zone non cliente. Cette fonction détermine également comment votre application doit gérer les effets de transition DWM.

L’exemple suivant désactive le rendu des zones non clientes. Ainsi, tous les appels précédents à DwmEnableBlurBehindWindow ou À DwmExtendFrameIntoClientArea sont désactivés.

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;
}

En plus de contrôler le rendu de la zone non cliente, DwmSetWindowAttribute peut également contrôler les effets de transition DWM. Vous pouvez définir le comportement de transition en utilisant DWMWA_TRANSITIONS_FORCEDISABLED comme paramètre dwAttribute .

Messages

Les messages suivants fournissent une notification des événements DWM. Ces messages peuvent être utilisés pour surveiller les modifications telles que les changements d’état de composition et les modifications de thème de couleur système.

Désactivation de la composition DWM (Windows 7 et versions antérieures)

Avertissement

Les informations de cette section s’appliquent uniquement aux systèmes Windows 7 et antérieurs.

Étant donné que DWM utilise l’unité de traitement graphique (GPU) pour la composition de bureau, votre application peut être amené à désactiver DWM pour la compatibilité. Les applications qui prennent le contrôle total du bureau, telles que les jeux qui s’exécutent en mode plein écran, doivent déterminer si le DWM est activé et, le cas échéant, le désactiver. Pour ce faire, deux fonctions sont nécessaires.

Un appel à DwmEnableComposition avec fEnable défini sur DWM_EC_DISABLECOMPOSITION désactive la composition DWM jusqu’à ce que le processus appelant soit arrêté ou que la composition ait été réactivée en appelant DwmEnableComposition avec fEnable défini sur DWM_EC_ENABLECOMPOSITION. La composition DWM redémarre automatiquement dès que toutes les applications qui ont désactivé la composition ont été arrêtées ou ont réactivé manuellement la composition en appelant DwmEnableComposition.

Notes

Le DWM désactive automatiquement la composition lorsqu’une application tente de dessiner directement sur la surface d’affichage principale. La composition est désactivée jusqu’à ce que la surface principale de l’appareil soit libérée par cette application.