Общие сведения о размытии 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;
}
На следующем рисунке показана размытие в стиле окна "лист стекла".