次の方法で共有


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を有効にしています。これで実行すると、次のように半透明な円が表示されます。
transparencyChildWindow

 

繰り返しますが、互換性はWindows 8/8.1/10 のどれかで動作します。この設定は、GetVersionEx関数が Windows 8以降で適切な OS バージョンを取得するために使用されているもになりますので、半透明の子ウィンドウを使用される場合は、Windows 8以降の OS のみの対応になることにご注意ください。