Общие сведения о размытии dwm

Одним из сигнатурных эффектов диспетчера окон рабочего стола (DWM) является полупрозрачная и размытая неклиентская область. API DWM позволяют приложениям применять эти эффекты к клиентской области окон верхнего уровня.

Примечание

Выпуск Windows Vista Home Basic не поддерживает эффект прозрачного стекла. Области, которые обычно отрисовываются с эффектом прозрачного стекла в других выпусках Windows, отображаются как непрозрачные. Начиная с Windows 8 вызов этой функции не приводит к эффекту размытия из-за изменения стиля в отрисовке окон.

 

В этом разделе рассматриваются следующие сценарии размытия программной части клиента, которые включает DWM.

Добавление размытия в определенный регион клиентской области

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

В этом сценарии используется функция DwmEnableBlurBehindWindow , которая использует dwm Blur Behind Constants и структуру DWM_BLURBEHIND .

В следующем примере функции EnableBlurBehindиллюстрируется применение эффекта размытия программной части ко всему окну.

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

Обратите внимание, что в параметре hRgnBlurзадано значение NULL. Это указывает DWM применить размытие за всем окном.

На следующем рисунке показан эффект размытия, применяемый ко всему окну.

эффект размытия, примененный к окну

Чтобы применить размытие за регионом, примените допустимый дескриптор области (HRGN) к члену hRgnBlurструктуры DWM_BLURBEHIND и добавьте флаг DWM_BB_BLURREGION к члену dwFlags .

При применении эффекта размытия задней части окна альфа-канал окна используется для неочерченной области. Это может привести к неожиданной прозрачности в неочерченной области окна. Поэтому будьте осторожны при применении эффекта размытия к подобласти.

Расширение рамки окна в клиентную область

Приложение может расширить размытие окна до клиентской области. Это полезно при применении эффекта размытия за окном с закрепленной панелью инструментов или визуально отделять элементы управления от остальной части приложения. Эта функция предоставляется функцией DwmExtendFrameIntoClientArea .

Чтобы включить размытие с помощью DwmExtendFrameIntoClientArea, используйте структуру MARGINS , чтобы указать, сколько необходимо расширить в клиентской области. В следующем примере функция ExtendIntoClientBottomпереключает расширение размытия в нижней части фрейма, не относящемся к клиенту, в клиентную область.

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

На следующем рисунке показан эффект размытия задней части, развернутый в нижней части клиентской области.

изображение, показывающее эффект размытия программной части, развернутый в нижней части клиентской области

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

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

На следующем рисунке показана размытие в стиле окна "лист стекла".

изображение, иллюстрирующий эффект размытия в стиле окна

Общие сведения о диспетчере окон рабочего стола

Включение и контроль композиции DWM

Рекомендации и рекомендации по производительности