Включение композиции DWM и управление ими

API-интерфейсы композиции Диспетчера окон рабочего стола (DWM) предоставляют несколько функций для настройки и запроса основных сведений, используемых DWM. Эти API позволяют запрашивать и изменять состояние композиции. Кроме того, можно задать и запросить политику отрисовки для различных атрибутов окна DWM.

Получение сведений о раскраски

Цвет неклиентской области окна определяется текущей системной цветовой темой. Значение раскраски предоставляется через API DWM, чтобы позволить приложению сопоставить пользовательский интерфейс клиента с системной цветовой темой.

Чтобы получить доступ к этому значению раскраски и отслеживать изменение цвета, используйте функцию DwmGetColorcolor и сообщение 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.

В следующем примере отключается отрисовка неклиентской области. Это приводит к отключению всех предыдущих вызовов DwmEnableBlurBehindWindow или 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. Эти сообщения можно использовать для отслеживания изменений, таких как изменения состояния композиции и изменения цветовой темы системы.

Отключение композиции DWM (Windows 7 и более ранние версии)

Предупреждение

Сведения в этом разделе относятся только к системам Windows 7 и более ранних версий.

Так как DWM использует графический процессор (GPU) для композиции рабочего стола, приложению может потребоваться отключить DWM для обеспечения совместимости. Приложения, которые полностью контролируют рабочий стол, например игры, выполняемые в полноэкранном режиме, должны определить, включена ли функция DWM, и, если она есть, отключить ее. Для этого требуются две функции.

Вызов DwmEnableComposition с параметром fEnable , для которого задано значение DWM_EC_DISABLECOMPOSITION , отключает композицию DWM до завершения процесса вызова или повторного включения композиции путем вызова DwmEnableComposition с параметром fEnable , для которого задано значение DWM_EC_ENABLECOMPOSITION. Композиция DWM автоматически перезапускается, как только все приложения, которые отключили композицию, завершат работу или повторно включили композицию вручную, вызвав DwmEnableComposition.

Примечание

DwM автоматически отключает композицию, когда приложение пытается выполнить рисование непосредственно к основной поверхности дисплея. Композиция будет отключена до освобождения основной поверхности устройства этим приложением.