Introducción al desenfoque de DWM

Uno de los efectos del Administrador de ventanas de escritorio (DWM) de firma es un área translúcida y desenfocada que no es de cliente. Las API de DWM permiten a las aplicaciones aplicar estos efectos al área cliente de sus ventanas de nivel superior.

Nota

La edición Home Basic de Windows Vista no admite el efecto de cristal transparente. Las áreas que normalmente se representarían con el efecto de vidrio transparente en otras ediciones de Windows se representan como opacos. A partir de Windows 8, llamar a esta función no produce el efecto de desenfoque, debido a un cambio de estilo en la forma en que se representan las ventanas.

 

En este tema se describen los siguientes escenarios de desenfoque de cliente que habilita DWM.

Agregar desenfoque a una región específica del área de cliente

Una aplicación puede aplicar el efecto de desenfoque detrás de toda la región cliente de la ventana o a una subregión específica. Esto permite a las aplicaciones agregar barras de búsqueda y ruta de acceso con estilo que sean visualmente independientes del resto de la aplicación.

La API que se usa en este escenario es la función DwmEnableBlurBehindWindow , que usa dwM Blur Behind Constants y la estructura DWM_BLURBEHIND .

La siguiente función de ejemplo, EnableBlurBehind, muestra cómo aplicar el efecto de desenfoque subyacente a toda la ventana.

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

Tenga en cuenta que null se especifica en el parámetro hRgnBlur . Esto indica al DWM que aplique el desenfoque detrás de toda la ventana.

En la imagen siguiente se muestra el efecto de desenfoque que se aplica a toda la ventana.

El efecto de desenfoque subyacente aplicado a una ventana

Para aplicar el desenfoque detrás de una subregión, aplique un identificador de región válido (HRGN) al miembro hRgnBlur de la estructura DWM_BLURBEHIND y agregue la marca DWM_BB_BLURREGION al miembro dwFlags .

Cuando se aplica el efecto de desenfoque a una subregión de la ventana, el canal alfa de la ventana se usa para el área noblurada. Esto puede provocar una transparencia inesperada en la región no relacionado de una ventana. Por lo tanto, tenga cuidado al aplicar un efecto de desenfoque a una subregión.

Extender el marco de ventana al área de cliente

Una aplicación puede extender el desenfoque del marco de ventana en el área cliente. Esto resulta útil cuando se aplica el efecto de desenfoque detrás de una ventana con una barra de herramientas acoplada o separe visualmente los controles del resto de una aplicación. Esta funcionalidad se expone mediante la función DwmExtendFrameIntoClientArea .

Para habilitar el desenfoque mediante DwmExtendFrameIntoClientArea, use la estructura MARGIN para indicar cuánto extenderse al área de cliente. La siguiente función de ejemplo, ExtendIntoClientBottom, activa la extensión de desenfoque en la parte inferior del marco que no es de cliente en el área de 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;
}

En la imagen siguiente se muestra el efecto de desenfoque extendido en la parte inferior del área de cliente.

imagen que muestra el efecto de desenfoque extendido en la parte inferior de un área de cliente

También disponible a través del método DwmExtendFrameIntoClientArea es el efecto "hoja de vidrio", donde el efecto de desenfoque se aplica a toda la superficie de la ventana sin borde de ventana visible. En el ejemplo siguiente se muestra este efecto en el que el área cliente se representa sin borde de ventana.

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

En la imagen siguiente se muestra el desenfoque subyacente en el estilo de ventana "hoja de vidrio".

imagen que muestra el efecto de desenfoque subyacente en el estilo de ventana

Desktop Window Manager Overview (Administrador de ventanas de escritorio)

Habilitar y controlar la composición de DWM

Consideraciones de rendimiento y procedimientos recomendados