技術領域の概要

WPF、Win32、DirectX などのアプリケーションで複数の表示テクノロジを使用する場合、共通のトップレベル ウィンドウ内のレンダリング領域を共有する必要があります。 このトピックでは、WPF 相互運用アプリケーションの表示と入力に影響する可能性がある問題について説明します。

領域

トップレベル ウィンドウ内では、相互運用アプリケーションのテクノロジの 1 つを構成する各 HWND に独自の領域 ("空域" とも呼ばれます) があることを概念化することができます。 ウィンドウ内の個々のピクセルは 1 つの HWND に属し、それによってその HWND の領域が構成されます (厳密に言えば、複数の WPF HWND がある場合は複数の WPF 領域がありますが、この説明の目的として、存在するのは 1 つのみと想定してください)。 この領域は、すべてのレイヤーまたは他のウィンドウは、アプリケーションの有効期間中にそのピクセル上にレンダリングされる場合、同じレンダリングレベル テクノロジに含まれる必要があることを意味します。 Win32 で WPF ピクセルをレンダリングしようとすると、望ましくない結果が生じるため、可能な限り相互運用 API によって禁止されます。

領域の例

次の図は、Win32、DirectX、および WPF が混在するアプリケーションを示しています。 各テクノロジには個別の重複しないピクセル セットが使用されているので、領域に関する問題はありません。

An example of an application that mixes Win32, DirectX, and WPF.

このアプリケーションでは、マウス ポインターの位置を使用して、これら 3 つの領域のいずれかにレンダリングされるアニメーションが作成されるとします。 アニメーションにどのようなテクノロジが使われたかにかかわらず、そのテクノロジは他の 2 つの領域に違反しています。 次の図は、Win32 領域上に WPF の円をレンダリングする試行を示しています。

An attempt to render a WPF circle over a Win32 region.

もう 1 つの違反は、異なるテクノロジ間で透明度またはアルファ ブレンドを使用しようとする場合です。 次の図の WPF ボックスは Win32 および DirectX 領域に違反しています。 その WPF ボックスのピクセルは半透明なので、DirectX と WPF の両方によって共同で所有される必要がありますが、それは不可能です。 そのため、これはもう 1 つの違反であり、構築できません。

Diagram showing a WPF box violating the Win32 and DirectX regions.

前述した 3 つの例では四角形の領域を使用しましたが、異なるシェイプも考えられます。 たとえば、穴のある領域も使用できます。 次の図は、四角形の穴がある Win32 領域を示しています。これは、WPF 領域と DirectX 領域を合わせたサイズです。

Diagram that shows a Win32 region with a rectangular hole.

領域は、完全に四角形以外にすることや、Win32 HRGN (領域) で記述できる任意のシェイプにすることができます。

Diagram that shows a nonrectangular region.

透明度とトップレベル ウィンドウ

Windows のウィンドウ マネージャーでは、実際には 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 はありません。 プラットフォームの呼び出しと HwndSource を使用して、関連する Win32 API を呼び出すことができます。 詳細については、「マネージド コードからのネイティブ関数の呼び出し」を参照してください。

WPF レイヤード ウィンドウは、オペレーティング システムによって機能が異なります。 これは、WPF にレンダリングに DirectX が使用され、レイヤード ウィンドウが DirectX レンダリングではなく主に GDI レンダリング用に設計されたためです。

  • WPF では、ハードウェア アクセラレータによるレイヤード ウィンドウをサポートしています。

  • WPF では透明カラー キーをサポートしていません。これは、WPF では要求された正確な色のレンダリングを保証できないためです。レンダリングにハードウェア アクセラレータが使用される場合は特にそうです。

関連項目