다음을 통해 공유


DWM 컴퍼지션 사용 및 제어

DWM(Desktop Window Manager) 컴퍼지션 API는 DWM에서 사용하는 기본 정보를 설정하고 쿼리하는 몇 가지 함수를 제공합니다. 이러한 API를 사용하면 컴퍼지션 상태를 쿼리하고 변경할 수 있습니다. 또한 다양한 DWM 창 특성에 대한 렌더링 정책을 설정하고 쿼리할 수 있습니다.

색 지정 정보 검색

창의 비 클라이언트 영역 색은 현재 시스템 색 테마에 의해 결정됩니다. 색화 값은 애플리케이션이 클라이언트 UI를 시스템 색 테마와 일치시킬 수 있도록 DWM API를 통해 제공됩니다.

이 색 지정 값에 액세스하고 색 변경을 모니터링하려면 DwmGetColorizationColor 함수와 WM_DWMCOLORIZATIONCOLORCHANGED 메시지를 사용합니다.

이 예제에서는 색이 변경된 메시지를 처리하고 새 색에 액세스하는 방법을 보여 줍니다.

...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
    DWORD newColorizationColor{ (DWORD)wParam };
    BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...

비 클라이언트 지역 렌더링 제어

DWM에서 사용할 수 있는 시각적 효과 중 두 가지는 창의 비 클라이언트 영역의 투명도 및 전환 효과입니다. 애플리케이션은 스타일 지정 또는 호환성을 위해 이러한 효과를 사용하지 않도록 설정하거나 다시 사용하도록 설정해야 할 수 있습니다. 다음 함수는 투명도 및 전환 효과 동작을 관리하는 데 사용됩니다.

애플리케이션 창에 대한 현재 비 클라이언트 렌더링 상태를 검색하려면 dwAttributeDWMWA_NCRENDERING_ENABLED설정된 DwmGetWindowAttribute 호출합니다. DWMWA_NCRENDERING_ENABLED설명서에서 볼 수 있듯이 해당 플래그를 DwmGetWindowAttribute전달할 때 검색된 특성 값은 BOOL 형식입니다. 플래그가 다르면 DwmGetWindowAttribute 다른 형식의 값을 반환합니다. 다음은 코드 예제입니다.

BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
    DWMWA_NCRENDERING_ENABLED,
    &isNCRenderingEnabled,
    sizeof(isNCRenderingEnabled));

다음 예제에서는 DwmGetWindowAttributeDWMWA_EXTENDED_FRAME_BOUNDS 플래그를 사용하여 창의 확장된 프레임 범위 사각형을 검색하는 방법을 보여 줍니다. 해당 플래그에 대한 설명서는 검색된 특성 값이 RECT 형식임을 알려줍니다.

RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
    DWMWA_EXTENDED_FRAME_BOUNDS,
    &extendedFrameBounds,
    sizeof(extendedFrameBounds));

메모

다른 특성에 대한 플래그를 사용하여 DwmGetWindowAttribute 호출할 때 위에 표시된 것과 동일한 프로그래밍 패턴을 따릅니다. DWMWINDOWATTRIBUTE 열거형 항목은 각 플래그의 행에서 DwmGetWindowAttribute대한 pvAttribute 매개 변수에 포인터를 전달해야 하는 값 유형을 나타냅니다. cbAttribute 매개 변수에는 해당 개체의 크기(바이트)가 포함됩니다.

DwmSetWindowAttribute 애플리케이션에서 비 클라이언트 영역 렌더링 정책을 설정할 수 있습니다. 또한 이 함수는 애플리케이션이 DWM 전환 효과를 처리하는 방법을 결정합니다.

다음 예제에서는 비 클라이언트 영역 렌더링을 사용하지 않도록 설정합니다. 이로 인해 DwmEnableBlurBehindWindow 또는 DwmExtendFrameIntoClientArea 대한 이전 호출이 비활성화됩니다.

HRESULT DisableNCRendering(HWND hWnd)
{
    HRESULT hr = S_OK;

    DWMNCRENDERINGPOLICY ncrp = DWMNCRP_DISABLED;

    // Disable non-client area rendering on the window.
    hr = ::DwmSetWindowAttribute(hWnd,
        DWMWA_NCRENDERING_POLICY,
        &ncrp,
        sizeof(ncrp));

    if (SUCCEEDED(hr))
    {
        // ...
    }

    return hr;
}

DwmSetWindowAttribute 비 클라이언트 영역 렌더링을 제어하는 것 외에도 DWM 전환 효과를 제어할 수 있습니다. DWMWA_TRANSITIONS_FORCEDISABLEDdwAttribute 매개 변수로 사용하여 전환 동작을 설정할 수 있습니다.

메시지

다음 메시지는 DWM 이벤트에 대한 알림을 제공합니다. 이러한 메시지를 사용하여 컴퍼지션 상태 변경 및 시스템 색 테마 변경과 같은 변경 내용을 모니터링할 수 있습니다.

DWM 컴퍼지션 사용 안 됨(Windows 7 이하)

경고

이 섹션의 정보는 Windows 7 및 이전 시스템에만 적용됩니다.

DWM은 데스크톱 컴퍼지션에 GPU(그래픽 처리 장치)를 사용하므로 애플리케이션은 호환성을 위해 DWM을 사용하지 않도록 설정해야 할 수 있습니다. 전체 화면 모드에서 실행되는 게임과 같이 데스크톱을 완전히 제어하는 애플리케이션은 DWM을 사용할 수 있는지 여부와 사용 가능한 경우 사용하지 않도록 설정해야 합니다. 이렇게 하려면 두 개의 함수가 필요합니다.

fEnable 설정된 DwmEnableComposition 호출하면 호출 프로세스가 종료되거나 fEnableDWM_EC_ENABLECOMPOSITION설정된 DwmEnableComposition 호출하여 컴퍼지션이 다시 활성화될 때까지 DWM 컴퍼지션이 DWM_EC_DISABLECOMPOSITION 비활성화됩니다. 컴퍼지션을 사용하지 않도록 설정한 모든 애플리케이션이 종료되거나 DwmEnableComposition호출하여 컴퍼지션을 수동으로 다시 사용하도록 설정한 즉시 DWM 컴퍼지션이 자동으로 다시 시작됩니다.

메모

DWM은 애플리케이션이 기본 디스플레이 화면에 직접 그리려고 할 때 컴퍼지션을 자동으로 사용하지 않도록 설정합니다. 컴퍼지션은 해당 애플리케이션에서 기본 디바이스 표면을 해제할 때까지 사용하지 않도록 설정됩니다.