WPF 相互運用 : "空域" およびウィンドウ領域の概要

更新 : 2007 年 11 月

"空域" とは、相互運用アプリケーションを構成する 2 つの部分のそれぞれが、共通のトップレベル ウィンドウ内のレンダリング領域を共有する方法を考える場合に使用される概念です。ここでは、"空域" の概念が WPF 相互運用アプリケーションのプレゼンテーション設計や、入力に関する考慮事項に与える影響について説明します。

空域

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

空域の例

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

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

しかし、このアプリケーションをベースとして、マウス ポインタの位置で制御されるアニメーションを作成するとします。このアニメーションは、これら 3 つのどの領域の上にも描画できてしまいます。これは、結局のところ空域に違反します。アニメーション自体をどのテクノロジが担当するとしても、そのテクノロジは他の 2 つの空域に違反することになります。これを次の図に示します。この図では、緑色の円がウィンドウ内を動き回ろうとしています。

相互運用ダイアグラム

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

相互運用ダイアグラム

前の 3 つの例では四角形の領域を使用しましたが、空域は必ずしも四角形である必要はありません。空域は、次の図のように、穴の空いた四角形にすることもできます (たとえば次の図で、Win32 の空域は、WPF と DirectX の空域を除いた残りの領域すべてになります)。

相互運用ダイアグラム

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

相互運用ダイアグラム

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

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 はありません。プラットフォーム呼び出しおよび 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 以外のレイヤード ウィンドウでも同じです。

参照

処理手順

チュートリアル : WPF コンテンツをホストする Win32 アプリケーションを作成する

チュートリアル : Win32 コンテンツをホストする WPF アプリケーションを作成する

概念

WPF と Win32 の相互運用性に関する概要