Compartir a través de


Habilitación y control de la composición de DWM

Las API de composición del Administrador de ventanas de escritorio (DWM) proporcionan varias funciones para establecer y consultar información básica que usa DWM. Estas API le permiten consultar y cambiar el estado de composición. Además, puede establecer y consultar la directiva de representación para distintos atributos de ventana dwM.

Recuperación de información de coloración

El color de la región que no es cliente de una ventana viene determinado por el tema de color del sistema actual. El valor de colorización se proporciona a través de las API dwM para permitir que la aplicación coincida con la interfaz de usuario del cliente con el tema de color del sistema.

Para acceder a este valor de color y supervisar el cambio de color, use la función DwmGetColorizationColor y el mensaje de WM_DWMCOLORIZATIONCOLORCHANGED.

En este ejemplo se muestra cómo controlar el mensaje de cambio de color y obtener acceso al nuevo color.

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

Control de la representación de regiones que no son cliente

Dos de los efectos visuales que permite DWM son la transparencia de la región no cliente de una ventana y los efectos de transición. Es posible que la aplicación tenga que deshabilitar o volver a habilitar estos efectos por motivos de estilo o compatibilidad. Las siguientes funciones se usan para administrar la transparencia y el comportamiento del efecto de transición.

Para recuperar el estado actual de representación que no es de cliente para la ventana de una aplicación, llame a dwmGetWindowAttribute con dwAttribute establecido en DWMWA_NCRENDERING_ENABLED. Como puede ver en la documentación de DWMWA_NCRENDERING_ENABLED, al pasar esa marca a DwmGetWindowAttribute, el valor del atributo recuperado es de tipo BOOL. Las distintas marcas provocan dwmGetWindowAttribute devolver valores de tipos diferentes. Este es un ejemplo de código.

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

En este ejemplo siguiente se muestra cómo usar la marca DWMWA_EXTENDED_FRAME_BOUNDS con DwmGetWindowAttribute para recuperar el rectángulo de límites de marco extendido de una ventana. La documentación de esa marca nos indica que el valor del atributo recuperado es de tipo RECT.

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

Nota

Siga el mismo patrón de programación que se muestra anteriormente al llamar a DwmGetWindowAttribute con marcas para atributos diferentes. El tema de enumeraciónDWMWINDOWATTRIBUTE indica, en la fila de cada marca, qué tipo de valor debe pasar un puntero a en el parámetro pvAttribute para DwmGetWindowAttribute. El parámetro cbAttribute contiene el tamaño, en bytes, de ese objeto.

dwmSetWindowAttribute permite a la aplicación establecer la directiva de representación de área no cliente. Esa función también determina cómo la aplicación debe controlar los efectos de transición de DWM.

En este ejemplo siguiente se deshabilita la representación de áreas que no son cliente. Esto hace que las llamadas anteriores a dwmEnableBlurBehindWindow o dwmExtendFrameIntoClientArea se deshabiliten.

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

Además de controlar la representación del área no cliente, DwmSetWindowAttribute también puede controlar los efectos de transición de DWM. Puede establecer el comportamiento de transición mediante DWMWA_TRANSITIONS_FORCEDISABLED como parámetro dwAttribute.

Mensajes

Los mensajes siguientes proporcionan una notificación de eventos DWM. Estos mensajes se pueden usar para supervisar cambios como cambios de estado de composición y cambios de tema de color del sistema.

Deshabilitación de la composición de DWM (Windows 7 y versiones anteriores)

Advertencia

La información de esta sección solo se aplica a Windows 7 y a sistemas anteriores.

Dado que DWM usa la unidad de procesamiento de gráficos (GPU) para la composición del escritorio, es posible que la aplicación tenga que deshabilitar DWM para la compatibilidad. Las aplicaciones que toman el control total del escritorio, como los juegos que se ejecutan en modo de pantalla completa, deben determinar si el DWM está habilitado y, si es así, deshabilitarlo. Para ello, se necesitan dos funciones.

Una llamada a DwmEnableComposition con fEnable establecido en DWM_EC_DISABLECOMPOSITION deshabilita la composición de DWM hasta que el proceso de llamada se haya cerrado o la composición se haya vuelto a habilitar llamando a DwmEnableComposition con fEnable establecido en DWM_EC_ENABLECOMPOSITION. La composición de DWM se reinicia automáticamente en cuanto todas las aplicaciones que han deshabilitado la composición han apagado o han vuelto a habilitar manualmente la composición llamando a DwmEnableComposition.

Nota

DwM deshabilita automáticamente la composición cuando una aplicación intenta dibujar directamente en la superficie de presentación principal. La composición se deshabilitará hasta que esa aplicación libere la superficie del dispositivo principal.