Partager via


Vue d’ensemble du flou DWM

L’un des effets signature de Desktop Window Manager (DWM) est une zone non cliente translucide et floue. Les API DWM permettent aux applications d’appliquer ces effets à la zone cliente de leurs fenêtres de niveau supérieur.

Notes

Windows Vista Édition Familiale Basic ne prend pas en charge l’effet verre transparent. Les zones qui s’affichent généralement avec l’effet de verre transparent sur d’autres éditions de Windows sont rendues opaques. À compter de Windows 8, l’appel de cette fonction n’entraîne pas l’effet de flou, en raison d’un changement de style dans le rendu des fenêtres.

 

Cette rubrique décrit les scénarios de flou client suivants activés par DWM.

Ajout de flou à une région spécifique de la zone cliente

Une application peut appliquer l’effet de flou derrière l’ensemble de la région cliente de la fenêtre ou à une sous-région spécifique. Cela permet aux applications d’ajouter des barres de recherche et de chemin d’accès avec style qui sont visuellement distinctes du reste de l’application.

L’API utilisée dans ce scénario est la fonction DwmEnableBlurBehindWindow , qui utilise les constantes de flou derrière-plan DWM et la structure DWM_BLURBEHIND .

L’exemple de fonction suivant, EnableBlurBehind, illustre comment appliquer l’effet de flou à l’ensemble de la fenêtre.

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

Notez que NULL est spécifié dans le paramètre hRgnBlur . Cela indique au DWM d’appliquer le flou derrière toute la fenêtre.

L’image suivante illustre l’effet de flou appliqué à l’ensemble de la fenêtre.

effet de flou appliqué à une fenêtre

Pour appliquer le flou derrière une sous-région, appliquez un handle de région valide (HRGN) au membre hRgnBlur de la structure DWM_BLURBEHIND et ajoutez l’indicateur DWM_BB_BLURREGION au membre dwFlags .

Lorsque vous appliquez l’effet de flou à une sous-partie de la fenêtre, le canal alpha de la fenêtre est utilisé pour la zone non enblurred. Cela peut entraîner une transparence inattendue dans la région non modifiable d’une fenêtre. Par conséquent, soyez prudent lorsque vous appliquez un effet de flou à une sous-région.

Extension du cadre de fenêtre dans la zone cliente

Une application peut étendre le flou du cadre de fenêtre dans la zone cliente. Cela est utile lorsque vous appliquez l’effet de flou derrière une fenêtre avec une barre d’outils ancrée ou des contrôles visuellement distincts du reste d’une application. Cette fonctionnalité est exposée par la fonction DwmExtendFrameIntoClientArea .

Pour activer le flou à l’aide de DwmExtendFrameIntoClientArea, utilisez la structure MARGEs pour indiquer la quantité à étendre à la zone cliente. L’exemple de fonction suivant, ExtendIntoClientBottom, bascule l’extension de flou en bas de l’image non cliente dans la zone 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;
}

L’image suivante illustre l’effet de flou étendu au bas de la zone cliente.

image montrant l’effet de flou étendu au bas d’une zone cliente

L’effet « feuille de verre » est également disponible via la méthode DwmExtendFrameIntoClientArea , où l’effet de flou est appliqué à toute la surface de la fenêtre sans bordure de fenêtre visible. L’exemple suivant illustre cet effet où la zone cliente est rendue sans bordure de fenêtre.

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

L’image suivante illustre le flou dans le style de fenêtre « feuille de verre ».

image illustrant l’effet de flou dans le style de fenêtre « feuille de verre »

Vue d’ensemble du Gestionnaire de fenêtres du Bureau

Activer et contrôler la composition du Gestionnaire de fenêtrage

Considérations relatives aux performances et bonnes pratiques