Включение и управление композицией DWM
API композиции диспетчера окон рабочего стола (DWM) предоставляют несколько функций для настройки и запроса базовых сведений, используемых DWM. Эти API позволяют запрашивать и изменять состояние композиции. Кроме того, можно задать и запросить политику отрисовки для различных атрибутов окна DWM.
Получение сведений о цветовой настройке
Цвет не клиентской области окна определяется текущей цветовой темой системы. Значение цвета предоставляется через API DWM, чтобы приложение соответствовало пользовательскому интерфейсу клиента с системной цветовой темой.
Чтобы получить доступ к этому значению цвета и отслеживать изменение цвета, используйте функцию DwmGetColorizationColor и сообщение WM_DWMCOLORIZATIONCOLORCHANGED.
В этом примере показано, как обрабатывать измененное цветом сообщение и получать доступ к новому цвету.
...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
DWORD newColorizationColor{ (DWORD)wParam };
BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...
Управление отрисовкой, отличной от клиента
Два визуальных эффекта, которые обеспечивают DWM, — прозрачность не клиентской области окна и эффекты перехода. Возможно, приложению придется отключить или повторно включить эти эффекты по причинам стилизации или совместимости. Следующие функции используются для управления поведением прозрачности и эффекта перехода.
Чтобы получить текущее состояние отрисовки, отличного от клиента, для окна приложения вызовите DwmGetWindowAttribute с dwAttribute для параметра DWMWA_NCRENDERING_ENABLED. Как видно из документации по DWMWA_NCRENDERING_ENABLED, при передаче этого флага в DwmGetWindowAttributeизвлекаемое значение атрибута имеет тип BOOL. Различные флаги вызывают DwmGetWindowAttribute возвращать значения различных типов. Ниже приведен пример кода.
BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_NCRENDERING_ENABLED,
&isNCRenderingEnabled,
sizeof(isNCRenderingEnabled));
В следующем примере показано, как использовать флаг DWMWA_EXTENDED_FRAME_BOUNDS с DwmGetWindowAttribute для получения прямоугольника расширенных границ кадров окна. В документации по этом флагу сообщается, что полученное значение атрибута имеет тип RECT.
RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&extendedFrameBounds,
sizeof(extendedFrameBounds));
Заметка
Следуйте приведенному выше шаблону программирования при вызове DwmGetWindowAttribute с флагами для различных атрибутов. Раздел перечисления DWMWINDOWATTRIBUTE указывает в строке для каждого флага, какой тип значения следует передать в параметр pvAttribute для DwmGetWindowAttribute. Параметр cbAttribute содержит размер этого объекта в байтах.
DwmSetWindowAttribute позволяет приложению задать политику отрисовки, отличной от клиента. Эта функция также определяет, как приложение должно обрабатывать эффекты перехода DWM.
В следующем примере отключается отрисовка не клиентской области. Это приводит к отключению всех предыдущих вызовов DwmEnableBlurBehindWind ow или DwmExtendFrameIntoClientArea.
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;
}
Помимо управления отрисовкой не клиентской области, DwmSetWindowAttribute также может управлять эффектами перехода DWM. Вы можете задать поведение перехода с помощью DWMWA_TRANSITIONS_FORCEDISABLED в качестве параметра dwAttribute.
Сообщения
Следующие сообщения предоставляют уведомление о событиях DWM. Эти сообщения можно использовать для отслеживания изменений, таких как изменения состояния композиции и изменения цветовой темы системы.
- WM_DWMCOLORIZATIONCOLORCHANGED
- WM_DWMCOMPOSITIONCHANGED
- WM_DWMNCRENDERINGCHANGED
- WM_DWMWINDOWMAXIMIZEDCHANGE
Отключение композиции DWM (Windows 7 и более ранних версий)
Предупреждение
Сведения в этом разделе относятся только к системам Windows 7 и более ранних версий.
Так как DWM использует графический модуль обработки (GPU) для композиции настольных компьютеров, приложению может потребоваться отключить DWM для обеспечения совместимости. Приложения, которые принимают полный контроль над рабочим столом, такие как игры, выполняемые в полноэкранном режиме, должны определить, включена ли DWM и если это так, отключите его. Для этого требуются две функции.
Вызов DwmEnableComposition с fEnable для DWM_EC_DISABLECOMPOSITION отключает композицию DWM до завершения вызова или повторной включения композиции путем вызова DwmEnableComposition с fEnable для DWM_EC_ENABLECOMPOSITION. Композиция DWM перезапускается автоматически, как только все приложения с отключенной композицией либо завершают работу, либо вручную повторно включены композиции, вызывая DwmEnableComposition.
Заметка
DWM автоматически отключает композицию, когда приложение пытается извлечь непосредственно на основную область отображения. Композиция будет отключена, пока основная поверхность устройства не будет выпущена этим приложением.