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 permiten consultar y cambiar el estado de composición. Además, puede establecer y consultar la directiva de representación para los distintos atributos de ventana de 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 de DWM para permitir que la aplicación coincida con la interfaz de usuario del cliente con el tema de color del sistema.
Para obtener acceso a este valor de color y supervisar el cambio de color, use la función DwmGetColorizationColor y el mensaje WM_DWMCOLORIZATIONCOLORCHANGED .
En este ejemplo se muestra cómo controlar el mensaje de cambio de color y acceder 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 de cliente
Dos de los efectos visuales que permite DWM son la transparencia de la región que no es de 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 hacen que DwmGetWindowAttribute devuelva valores de diferentes tipos. Aquí tienes 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ón DWMWINDOWATTRIBUTE indica, en la fila de cada marca, qué tipo de valor debe pasar un puntero al 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 de cliente. Esto hace que las llamadas anteriores a DwmEnableBlurBehindWindow o DwmExtendFrameIntoClientArea estén deshabilitadas.
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 que no es 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 .
error de Hadoop
Los mensajes siguientes proporcionan una notificación de eventos DWM. Estos mensajes se pueden usar para supervisar los cambios, como los cambios de estado de composición y los cambios de tema de color del sistema.
- WM_DWMCOLORIZATIONCOLORCHANGED
- WM_DWMCOMPOSITIONCHANGED
- WM_DWMNCRENDERINGCHANGED
- WM_DWMWINDOWMAXIMIZEDCHANGE
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 sistemas anteriores.
Dado que DWM usa la unidad de procesamiento de gráficos (GPU) para la composición de escritorio, es posible que la aplicación tenga que deshabilitar DWM por 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 establecida en DWM_EC_DISABLECOMPOSITION deshabilita la composición de DWM hasta que el proceso de llamada se haya apagado o se haya vuelto a habilitar la composición 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 se han apagado o han vuelto a habilitar manualmente la composición mediante una llamada 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 la aplicación libere la superficie del dispositivo principal.