Share via


WPF 상호 운용: "에어스페이스" 및 창 영역 개요

업데이트: 2007년 11월

"에어스페이스"란 상호 운용되는 응용 프로그램의 두 부분이 공통의 최상위 창에서 렌더링 영역을 어떻게 공유하는지 설명하는 개념입니다. 이 항목에서는 "에어스페이스" 개념이 WPF 상호 운용 응용 프로그램의 화면 디자인뿐만 아니라 입력 고려 사항에 미치는 영향에 대해 설명합니다.

에어스페이스

최상위 창에서 상호 운용 응용 프로그램의 기술 중 하나를 구성하는 각 HWND에는 고유한 "에어스페이스"가 있습니다. 창 내의 각 픽셀은 정확히 한 개의 HWND에만 포함되어 해당 HWND의 에어스페이스를 구성합니다. 엄밀히 말하자면 WPF HWND가 두 개 이상 있으면 WPF 에어스페이스도 두 개 이상 존재하지만 개념을 설명하기 위해 이 항목의 예제에서는 HWND가 한 개만 있다고 가정합니다. 에어스페이스 개념에 따르면 응용 프로그램의 수명 동안 특정 픽셀에서 렌더링되는 모든 계층 또는 다른 창은 반드시 동일한 렌더링 수준 기술의 일부여야 합니다. WPF 픽셀을 Win32에서 렌더링하려고 하면 예기치 않은 결과가 나타나며 이와 같은 작업은 상호 운용 API에서 가능한 한 제한됩니다.

에어스페이스 예제

첫 번째 예제에서는 Win32, DirectX 및 WPF가 혼합된 응용 프로그램을 보여 줍니다. 이 경우 각 기술은 서로 겹치지 않는 고유한 픽셀 집합을 사용하기 때문에 에어스페이스 문제가 없습니다.

에어스페이스 문제가 없는 창

그러나 응용 프로그램에서 마우스 포인터 위치에 따라 제어되는 애니메이션을 만들어 이 세 개 영역 모두를 대상으로 렌더링을 시도하려 한다고 가정해 보십시오. 이 경우 결과적으로 에어스페이스를 침범하는 문제가 발생합니다. 즉, 어느 기술을 사용하여 애니메이션을 구현했는지에 관계없이 해당 기술은 다른 두 기술의 에어스페이스를 침범할 수 있습니다. 다음 그림에서는 이러한 시나리오를 보여 주며, 여기서는 녹색 원이 창에서 이동하려고 합니다.

Interop 다이어그램

서로 다른 기술 사이에 투명효과/알파 혼합을 사용하려는 경우에도 에어스페이스를 침범할 수 있습니다. 다음 그림에서는 WPF 상자가 Win32 및 DirectX 에어스페이스를 침범합니다. WPF 상자의 픽셀은 반투명이기 때문에 DirectX와 WPF가 공동으로 소유해야 하지만 이는 불가능합니다. 따라서 이 예제도 에어스페이스를 침범하는 경우이므로 구현할 수 없습니다.

Interop 다이어그램

앞의 세 가지 예제에서는 사각형 영역을 예로 들었지만 에어스페이스가 반드시 사각형일 필요는 없습니다. 에어스페이스는 구멍 있는 사각형일 수도 있습니다. 예를 들어 다음 그림에서 Win32 에어스페이스는 WPF 에어스페이스와 DirectX 에어스페이스를 제외한 모든 영역입니다.

Interop 다이어그램

또한 다음과 같이 에어스페이스는 사각형이 아니거나 Win32 HRGN(영역)으로 나타낼 수 있는 모든 모양일 수 있습니다.

Interop 다이어그램

투명도 및 최상위 창

Windows Vista 및 Microsoft Windows XP에서 창 관리자 프로세스는 실제로 Win32 HWND만 처리하므로 모든 WPF Window는 HWND입니다. 이에 따라 Window HWND는 모든 HWND에 대한 일반적인 규칙을 준수해야 합니다. HWND 내에서는 WPF 코드로 전체 WPF API에서 지원하는 모든 작업을 수행할 수 있지만 데스크톱의 다른 HWND와 상호 작용하는 데 있어서는 WPF에서 Win32 처리 및 렌더링 규칙을 준수해야 합니다. WPF에서는 Win32 API를 사용하여 사각형이 아닌 창을 지원합니다. 즉, 사각형이 아닌 창에 대해서는 HRGN을 사용하고, 픽셀별 알파를 위해서는 계층 창을 사용합니다.

상수 알파 및 색상 키는 지원되지 않으며 Win32 계층 창 기능은 플랫폼에 따라 다르게 지원됩니다.

계층 창을 사용하면 창의 모든 픽셀에 적용할 알파 값을 지정하여 창 전체를 반투명하게 만들 수 있습니다. (Win32에서 픽셀별 알파를 지원하기는 하지만 이 모드에서는 대화 상자와 드롭다운을 포함하여 모든 자식 HWND를 직접 그려야 하기 때문에 실제 프로그램에서는 사용하기 매우 어렵습니다.

WPF에서는 HRGN을 지원하지만 이 기능에 대한 관리되는 API가 없습니다. 이 경우 P/Invoke 호출과 HwndSource를 사용하여 적절한 Win32 API를 호출할 수 있습니다. 자세한 내용은 관리 코드에서 네이티브 함수 호출을 참조하십시오.

WPF 계층 창은 운영 체제마다 기능이 다릅니다. 이는 WPF는 DirectX를 사용하여 렌더링하지만 계층 창은 기본적으로 DirectX 렌더링이 아닌 GDI 렌더링용으로 디자인되었기 때문입니다.

  • WPF에서는 Windows Vista에서 하드웨어 가속 계층 창을 지원합니다. Microsoft Windows XP의 경우에는 하드웨어 가속 계층 창에 Microsoft DirectX가 필요하기 때문에 각 컴퓨터의 Microsoft DirectX 버전에 따라 사용할 수 있는 기능이 달라집니다.

  • WPF에서는 투명 색상 키를 지원하지 않습니다. 그 이유는 WPF에서는 특히 하드웨어 가속 렌더링을 사용하는 경우 요청된 색을 정확하게 렌더링하지 못할 수 있기 때문입니다.

  • 계층 창을 Microsoft Windows XP에서 실행하는 경우, DirectX 응용 프로그램에서 렌더링하는 동안 DirectX 화면에서 창이 깜빡일 수 있습니다. 실제로 렌더링은 Microsoft Windows GDI(그래픽 장치 인터페이스)에서 계층 창을 숨기고 DirectX에서 그린 다음 Microsoft Windows GDI(그래픽 장치 인터페이스)에서 계층 창을 다시 표시하는 순서로 이루어집니다. WPF가 아닌 계층 창의 경우에도 이러한 제한이 적용됩니다.

참고 항목

작업

자습서: Win32 응용 프로그램 호스팅 WPF 콘텐츠 만들기

자습서: WPF 응용 프로그램 호스팅 Win32 콘텐츠 만들기

개념

WPF 및 Win32 상호 운용성 개요