2007年06月04日
川俣晶の縁側ソフトウェア技術雑記 total 17535 count

C#によるAeroを使った全面半透明ウィンドウの作り方

Written By: 川俣 晶連絡先

 Windows VistaのAeroを使うと、一部が透けて見えるウィンドウが生成されます。

 ここで、APIを呼んで意識的にコントロールすると、半透明になる領域を制御できます。その結果として、全面半透明というウィンドウも作成できます。

 そのためのやり方は、以下のMSDN Managineの記事にあります。

 しかし、この記事は様々な機能について解説を行っていて、分かりにくいという難点があります。そこで、全面半透明のウィンドウを作る最低限のコードを作ってみました。

 以下のような感じです。

スクリーンショット

手順 §

  1. Visual Studio 2005を使用し、C#によるWindowsアプリケーションのプロジェクトを作成します
  2. フォームのBackColorを黒(RGB=0,0,0)にします
  3. プロジェクトにWin32Api.csというファイルを新規作成します
  4. 上記MSDN Managineの記事のサンプルソースからWin32Api.csファイルを開き、先頭のusing文と、クラスDwmApiの定義を新しく作ったWin32Api.csにもらってきます (名前空間MsdnMagのままで良ければ、ファイルをそのままコピーして取り込んでも可)
  5. フォームのLoadイベントに下記リストのコードを入力します
  6. F5を押してゴー!

 以上です。

サンプルソース §

private void Form1_Load(object sender, EventArgs e)

{

    if (DwmApi.DwmIsCompositionEnabled())

    {

        DwmApi.DwmExtendFrameIntoClientArea(this.Handle, 

                           new DwmApi.MARGINS(-1, 0, 0, 0));

    }

}

説明 §

 Win32Api.csはAPIを呼び出すためのラッパです。"dwmapi.dll"からDllImportされたexternなメソッドの塊です。単純に借りてきて使えば良いでしょう。

 DwmIsCompositionEnabledはAeroが有効かどうかの判定。DwmExtendFrameIntoClientAreaはクライアント領域のエッジからどこまで深く半透明にするかの指定。MARGINSは、上下左右のマージンを指定するデータの入れ物ですが、先頭の-1は特別な意味を持っていて、これは「クライアント領域全体」を指定しています。つまり、残りの0,0,0は意味を持っていません。

 ……ということだと思います。たぶん (汗。

 ちなみに、フォームの背景を黒にすることをお忘れなく。逆に言えば、黒はそのまま使うと透過扱いなので、黒い文字を描いても透けてしまいます。対策は上記MSDN Magazineの記事に載っています。