WPF、Win32、DirectX などの複数のプレゼンテーション テクノロジをアプリケーションで使用する場合は、共通の最上位ウィンドウ内でレンダリング領域を共有する必要があります。 このトピックでは、WPF 相互運用アプリケーションのプレゼンテーションと入力に影響する可能性がある問題について説明します。
リージョン
最上位のウィンドウ内では、相互運用アプリケーションのテクノロジの 1 つを構成する各 HWND に独自の領域 ("空域" とも呼ばれます) があることを概念化できます。 ウィンドウ内の各ピクセルは、その HWND の領域を構成する 1 つの HWND に属します。 (厳密に言えば、複数の WPF HWND がある場合は複数の WPF リージョンがありますが、この説明の目的上、1 つだけであると仮定できます)。 この領域は、アプリケーションの有効期間中にそのピクセルの上にレンダリングしようとするすべてのレイヤーまたはその他のウィンドウが、同じレンダリング レベルテクノロジの一部である必要があることを意味します。 Win32 に WPF ピクセルをレンダリングしようとすると望ましくない結果が発生し、相互運用 API を通じて可能な限り許可されません。
地域の例
次の図は、Win32、DirectX、WPF を混在するアプリケーションを示しています。 各テクノロジでは、個別の重複しないピクセル セットが使用され、領域の問題はありません。
このアプリケーションでは、マウス ポインターの位置を使用して、これら 3 つの領域のいずれかにレンダリングを試みるアニメーションを作成するとします。 どのテクノロジがアニメーション自体を担当していたとしても、そのテクノロジは他の 2 つの領域に違反します。 次の図は、Win32 リージョンに WPF 円をレンダリングする試みを示しています。
もう 1 つの違反は、異なるテクノロジ間で透明度/アルファ ブレンドを使用しようとした場合です。 次の図では、WPF ボックスが Win32 および DirectX リージョンに違反しています。 その WPF ボックス内のピクセルは半透明であるため、DirectX と WPF の両方で共同で所有する必要があります。これは不可能です。 したがって、これは別の違反であり、構築することはできません。
前の 3 つの例では四角形領域を使用しましたが、異なる図形を使用できます。 たとえば、領域に穴がある場合があります。 次の図は、四角形の穴を持つ Win32 領域を示しています。これは、WPF リージョンと DirectX リージョンを組み合わせたサイズです。
領域は、完全に非回復性にすることも、Win32 HRGN (リージョン) によって記述可能な任意の図形にすることもできます。
Windows の透明度と Top-Level
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 では要求した正確な色のレンダリングを保証できないためです。
相互運用リージョンの制限事項の詳細については、 WPF 内の HWND を参照してください。
こちらも参照ください
.NET Desktop feedback