DWM 컴퍼지션 사용 및 제어
DWM(데스크톱 창 관리자) 컴퍼지션 API는 DWM에서 사용하는 기본 정보를 설정하고 쿼리하기 위한 몇 가지 함수를 제공합니다. 이러한 API를 사용하면 컴퍼지션 상태를 쿼리하고 변경할 수 있습니다. 또한 다양한 DWM 창 특성에 대한 렌더링 정책을 설정하고 쿼리할 수 있습니다.
색 지정 정보 검색
창의 비 클라이언트 영역 색은 현재 시스템 색 테마에 의해 결정됩니다. 색화 값은 애플리케이션이 클라이언트 UI와 시스템 색 테마를 일치시킬 수 있도록 DWM API를 통해 제공됩니다.
이 색화 값에 액세스하고 색 변경을 모니터링하려면 DwmGetColorizationColor 함수와 WM_DWMCOLORIZATIONCOLORCHANGED 메시지를 사용합니다.
이 예제에서는 색 변경 메시지를 처리하고 새 색에 액세스하는 방법을 보여 줍니다.
...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
DWORD newColorizationColor{ (DWORD)wParam };
BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...
비 클라이언트 지역 렌더링 제어
DWM에서 사용하도록 설정하는 시각적 효과 중 두 가지는 창의 비 클라이언트 영역의 투명도와 전환 효과입니다. 애플리케이션은 스타일 지정 또는 호환성을 위해 이러한 효과를 사용하지 않도록 설정하거나 다시 사용하도록 설정해야 할 수 있습니다. 다음 함수는 투명도 및 전환 효과 동작을 관리하는 데 사용됩니다.
애플리케이션 창에 대한 현재 비 클라이언트 렌더링 상태를 검색하려면 dwAttribute가 DWMWA_NCRENDERING_ENABLED 설정된 DwmGetWindowAttribute를 호출합니다. DWMWA_NCRENDERING_ENABLED 설명서에서 볼 수 있듯이 해당 플래그를 DwmGetWindowAttribute에 전달하면 검색된 특성 값은 BOOL 형식입니다. 플래그가 다르면 DwmGetWindowAttribute 가 서로 다른 형식의 값을 반환합니다. 코드 예제는 다음과 같습니다.
BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_NCRENDERING_ENABLED,
&isNCRenderingEnabled,
sizeof(isNCRenderingEnabled));
다음 예제에서는 DwmGetWindowAttribute와 함께 DWMWA_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_FORCEDISABLED dwAttribute 매개 변수로 사용하여 전환 동작을 설정할 수 있습니다.
메시지
다음 메시지는 DWM 이벤트에 대한 알림을 제공합니다. 이러한 메시지를 사용하여 컴퍼지션 상태 변경 및 시스템 색 테마 변경과 같은 변경 내용을 모니터링할 수 있습니다.
- WM_DWMCOLORIZATIONCOLORCHANGED
- WM_DWMCOMPOSITIONCHANGED
- WM_DWMNCRENDERINGCHANGED
- WM_DWMWINDOWMAXIMIZEDCHANGE
DWM 컴퍼지션 사용 안 됨(Windows 7 이하)
경고
이 섹션의 정보는 Windows 7 및 이전 시스템에만 적용됩니다.
DWM은 데스크톱 컴퍼지션에 GPU(그래픽 처리 장치)를 사용하므로 애플리케이션은 호환성을 위해 DWM을 사용하지 않도록 설정해야 할 수 있습니다. 전체 화면 모드에서 실행되는 게임과 같이 데스크톱을 완전히 제어하는 애플리케이션은 DWM을 사용할 수 있는지 여부와 사용 안 함을 결정해야 합니다. 이렇게 하려면 두 개의 함수가 필요합니다.
fEnable이 DWM_EC_DISABLECOMPOSITION 설정된 DwmEnableComposition에 대한 호출은 호출 프로세스가 종료되거나 fEnable이 DWM_EC_ENABLECOMPOSITION 설정된 DwmEnableComposition을 호출하여 컴퍼지션을 다시 사용하도록 설정할 때까지 DWM 컴퍼지션을 사용하지 않도록 설정합니다. 컴퍼지션을 사용하지 않도록 설정한 모든 애플리케이션이 종료되거나 DwmEnableComposition을 호출하여 컴퍼지션을 수동으로 다시 사용하도록 설정하는 즉시 DWM 컴퍼지션이 자동으로 다시 시작됩니다.
참고
DWM은 애플리케이션이 기본 디스플레이 화면에 직접 그리려고 할 때 컴퍼지션을 자동으로 사용하지 않도록 설정합니다. 컴퍼지션은 해당 애플리케이션에서 기본 디바이스 표면을 해제할 때까지 사용하지 않도록 설정됩니다.