Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Одним из характерных эффектов Desktop Window Manager (DWM) является полупрозрачная и размытая неклиентская область. API DWM позволяют приложениям применять эти эффекты к клиентской области окон верхнего уровня.
Заметка
Выпуск Windows Vista Home Basic не поддерживает прозрачный стеклянный эффект. Области, которые обычно будут отображаться с прозрачным эффектом стекла на других выпусках Windows, отображаются как непрозрачные. Начиная с Windows 8 вызов этой функции не приводит к эффекту размытия из-за изменения стиля в способах отрисовки окон.
В этом разделе рассматриваются следующие сценарии размытия фона клиентских окон, которые поддерживаются DWM.
- добавление размытия в конкретный регион клиентской области
- Расширение области окна в клиентскую часть
- Связанные темы
Добавление размытия в конкретную область клиентской области
Приложение может применить эффект размытия за всей клиентской областью окна или к конкретной подобласти. Это позволяет приложениям добавлять стилированные пути и панели поиска, которые визуально отделены от остальной части приложения.
API, используемый в этом сценарии, — это функция DwmEnableBlurBehindWindow, которая использует константы размытия DWM за окном и структуру 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;
}
Обратите внимание, что NULL указан в параметре hRgnBlur. Это указывает DWM применить размытие позади всего окна.
На следующем рисунке показан эффект размытия, примененный ко всему окну.
Чтобы применить размытие за подрегионом, примените допустимый дескриптор региона (HRGN) к элементу hRgnBlur членa структуры 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;
}
На следующем рисунке показано размытие заднего плана в окнах в стиле "лист стекла".
Связанные разделы