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

NULLhRgnBlur 매개 변수에 지정됩니다. 이렇게 하면 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;
}

다음 이미지는 "유리 시트" 창 스타일의 흐림을 보여 줍니다.

바탕 화면 창 관리자 개요

DWM 컴퍼지션 설정 및 제어

성능 고려 사항 및 모범 사례