DWM 흐림 뒤에 개요
시그니처 DWM(데스크톱 창 관리자) 효과 중 하나는 반투명하고 흐리게 표시되는 비 클라이언트 영역입니다. DWM API를 사용하면 애플리케이션이 최상위 창의 클라이언트 영역에 이러한 효과를 적용할 수 있습니다.
참고
Windows Vista Home Basic Edition은 투명 효과를 지원하지 않습니다. 일반적으로 다른 Windows 버전에서 투명한 유리 효과로 렌더링되는 영역은 불투명하게 렌더링됩니다. Windows 8 시작해도 창 렌더링 방식의 스타일 변경으로 인해 이 함수를 호출해도 흐림 효과가 발생하지 않습니다.
이 항목에서는 DWM에서 사용하도록 설정하는 다음과 같은 클라이언트 흐림 방지 시나리오에 대해 설명합니다.
애플리케이션은 창의 전체 클라이언트 영역 뒤에 또는 특정 하위 영역에 흐림 효과를 적용할 수 있습니다. 이렇게 하면 애플리케이션에서 애플리케이션의 나머지 부분과 시각적으로 분리된 스타일이 지정된 경로 및 검색 막대를 추가할 수 있습니다.
이 시나리오에서 사용되는 API는 DWM Blur Behind 상수 및 DWM_BLURBEHIND 구조를 사용하는 DwmEnableBlurBehindWindow 함수입니다.
다음 예제 함수인 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에 전체 창 뒤에 흐림 효과를 적용하도록 지시합니다.
다음 이미지는 전체 창에 적용된 흐림 효과에 대해 보여 줍니다.
하위 영역 뒤에 흐림 효과를 적용하려면 DWM_BLURBEHIND 구조체의 hRgnBlur 멤버에 유효한 지역 핸들(HRGN)을 적용하고 dwFlags 멤버에 DWM_BB_BLURREGION 플래그를 추가합니다.
창의 하위 영역에 흐리게 숨김 효과를 적용하면 창의 알파 채널이 nonblurred 영역에 사용됩니다. 이로 인해 창의 nonblurred 영역에서 예기치 않은 투명도가 발생할 수 있습니다. 따라서 하위 리소스에 흐림 효과를 적용할 때는 주의해야 합니다.
애플리케이션은 창 프레임의 흐림을 클라이언트 영역으로 확장할 수 있습니다. 이는 도킹된 도구 모음을 사용하여 창 뒤에 흐림 효과를 적용하거나 애플리케이션의 나머지 부분과 시각적으로 컨트롤을 분리할 때 유용합니다. 이 기능은 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;
}
다음 이미지는 "유리 시트" 창 스타일의 흐림을 보여 줍니다.