技術領域の概要

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

領域

トップレベル ウィンドウ内では、相互運用アプリケーションのテクノロジの 1 つを構成する HWND のそれぞれに独自の領域 ("空域" とも呼ばれます) がある、と考えることができます。 ウィンドウ内の各ピクセルはただ 1 つの HWND に属しており、これがその HWND の領域を構成します (厳密に言えば、複数の WPF HWND が存在する場合には複数の WPF 領域が存在しますが、ここでは説明しやすくするために、存在する領域は 1 つだけであると仮定します)。 領域は、アプリケーションの有効期間中にそのピクセルの上に描画を試行するすべての層またはその他のウィンドウが、同じ描画レベル テクノロジの一部である必要があることを意味しています。 Win32 上で WPF ピクセルを描画しようとすると、望ましくない結果が生じるため、相互運用 APIs によって可能な限り禁止されています。

領域の例

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

空域の問題がないウィンドウ

このアプリケーションでマウス ポインターの位置を使用して、これら 3 つのどの領域の上にも描画を試みるアニメーションを作成するとします。 アニメーション自体をどのテクノロジが担当するとしても、そのテクノロジは他の 2 つの領域に違反することになります。 Win32 の領域の上に WPF の円の描画を試みる場合を次の図に示します。

相互運用ダイアグラム

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

相互運用ダイアグラム

前の 3 つの例では四角形領域を使用しましたが、別の形状を使用することもできます。 たとえば、領域に穴を使用できます。 四角形の穴がある Win32 の領域を次の図に示します。これは、WPF と DirectX の領域を結合したサイズです。

相互運用ダイアグラム

領域は、次の図のように、まったく四角形でない図形や、Win32 の HRGN (領域) で記述できる任意の図形にすることもできます。

相互運用ダイアグラム

透過性とトップレベル ウィンドウ

Windows でのウィンドウ マネージャーは、実際には Win32 の HWND のみを処理します。 したがって、それぞれの WPF Window は HWND です。 Window HWND は、すべての HWND の一般規則に従う必要があります。 その HWND 内で、WPF コードは WPF APIs 全体がサポートすることであれば、すべて実行できます。 しかし、デスクトップ上で他の HWND と対話する場合、WPF は Win32 の処理と描画の規則に従う必要があります。 WPF は、Win32 APIs の非四角形ウィンドウ用 HRGN と、ピクセルごとのアルファ情報をサポートするレイヤード ウィンドウを使用することで、四角形以外のウィンドウをサポートします。

一定のアルファおよびカラー キーはサポートされません。 Win32 のレイヤード ウィンドウの機能は、プラットフォームによって異なります。

レイヤード ウィンドウでは、ウィンドウ内のすべてのピクセルに適用するアルファ値を指定することで、ウィンドウ全体を半透明にすることができます (Win32 は実際にはピクセルごとのアルファをサポートしていますが、このモードでは、ダイアログやドロップダウンなどを含むすべての子 HWND を開発者自身で描画する必要があるため、これを実用プログラムで使用することは非常に困難です)。

WPF は HRGN をサポートしますが、この機能に対応するマネージ APIs はありません。 プラットフォーム呼び出しおよび HwndSource を使用すると、関連する Win32 APIs を呼び出すことができます。 詳細については、「マネージ コードからのネイティブ関数の呼び出し」を参照してください。

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

  • WPF は、Windows Vista 以降では、ハードウェアで加速されたレイヤード ウィンドウをサポートします。 ハードウェアで加速されたレイヤード ウィンドウを Microsoft Windows XP 上で使用するには、Microsoft DirectX によるサポートが必要となるため、この機能は、実行するマシンの Microsoft DirectX のバージョンに依存します。

  • WPF では、特にレンダリングがハードウェアで加速されている場合、要求された正確な色を描画することを保証できないため、WPF は、透明度カラー キーをサポートしません。

  • アプリケーションを Microsoft Windows XP で実行している場合、レイヤード ウィンドウを DirectX サーフェイス上で実行すると、DirectX アプリケーションでの描画時に、ちらつきが発生します (実際のレンダリング シーケンスでは、まず Microsoft Windows Graphics Device Interface (GDI) がレイヤード ウィンドウを非表示にし、次に DirectX が描画を実行した後、Microsoft Windows Graphics Device Interface (GDI) がレイヤード ウィンドウを元に戻します)。 この制限は、WPF 以外のレイヤード ウィンドウでも同じです。

参照

処理手順

チュートリアル: Win32 での WPF クロックのホスト

WPF での Win32 コンテンツのホスト

概念

WPF と Win32 の相互運用性