WPF の半透明の子ウィンドウの使い方について
.NET Framework 4.6 のリリースに伴って、WPF では 透過的な子ウィンドウのサポートが提供されました。具体的な使い方としては、WPF チームのブログの The Roadmap for WPF という記事の、コメント欄にサンプル コードがあります。
私も見落としていて、先週末に教えていただいたのですが(有難うございました。見落としていました)、このサンプルを動かすための条件があります。MSDN ライブラリーの.NET Framework の新機能には「Windows 8.1以降」という記述もありました。この透過的な子ウィンドウというのは、半透明なChild Window をサポートするというもので、具体的には HwndSourceParameters.UsesPerPixelTransparency プロパティを使用するというものになります。ドキュメント上の要件は、.NET Framework 4.6以上とだけ記述されていますが、私が確認した限りは Windows 8 以降で動作します。WPF Blogに掲載されていたコードを次に示します。
IntPtr parentWindowHandle = new WindowInteropHelper(this).Handle;
HwndSourceParameters windowParams = new HwndSourceParameters("SemiTransparentChildWindow");
windowParams.ParentWindow = parentWindowHandle;
//int values of WS_CHLID, WS_CLIPCHILDREN, and WS_VISIBLE
int styleParams = 0x40000000 | 0x02000000 | 0x10000000;
windowParams.WindowStyle = styleParams;
windowParams.UsesPerPixelTransparency = true;
windowParams.PositionX = 100;
windowParams.PositionY = 100;
HwndSource hwndsSrc = new HwndSource(windowParams);
Ellipse ellipse = new Ellipse();
ellipse.Width = 100;
ellipse.Height = 100;
ellipse.Fill = Brushes.Green;
ellipse.Opacity = 0.1;
hwndsSrc.RootVisual = ellipse;
このコードをボタン クリックなどのイベント ハンドラーに記述します。そして、マニフェストを追加して、Windows 8 /Windows 8.1/Windows 10のどれかの互換性を有効にします。
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<supportedos id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
上記の例では、Windows 10を有効にしています。これで実行すると、次のように半透明な円が表示されます。
繰り返しますが、互換性はWindows 8/8.1/10 のどれかで動作します。この設定は、GetVersionEx関数が Windows 8以降で適切な OS バージョンを取得するために使用されているもになりますので、半透明の子ウィンドウを使用される場合は、Windows 8以降の OS のみの対応になることにご注意ください。