レイヤードウィンドウは結局使わないことにしたのだが、今までのまとめをしておこう。
レイヤードウィンドウとは
- レイヤードウィンドウとはα値によるウィンドウの半透明処理および指定色を透明化することができるウィンドウである。
- Windows2000から実装されていてWindows 7でも利用可能である。
- 当初はソフトウェア処理であったが、Windows 7 + WDDM 1.1ドライバの環境下ではHWアクセラレーションされるようになっていると推測される。ただし処理がどの程度アクセラレートされるかは不明である。
レイヤードウィンドウの用途
- 新たな視覚効果を導入する(フェードイン・フェードアウト・影つきウィンドウ・影つきマウスカーソル)。
- チラつきのないアニメーションウィンドウを実現する。
- 不定形ウィンドウを簡単に効率よく実現する。
レイヤードウィンドウの利用方法
基本的には拡張ウィンドウスタイルにWS_EX_LAYEREDを設定してCreateWindowExする。レイヤードウィンドウは初期状態ではアルファ値はゼロであり画面には何も表示されない。表示・画面更新するには2通りの方法がある。
SetLayeredWindowAttributesによる方法
これはウィンドウ全体に透明度および透過色を設定するAPIである。設定するとウィンドウ全体に半透明・透明処理が行われる。通常のウィンドウ処理と同様にメッセージ(WM_PAINTなど)が来るので普通に描画すればその部分も合わせて半透明・透明処理がOSにより自動的に行われる。
UpdateLayeredWindowによる方法
UpdateLayeredWindowはメモリDCなどの矩形領域で透明・半透明処理を行いながら画面を更新するAPIである。ウィンドウ位置・大きさも同時に更新できる。このAPIを呼び出しても再描画を促すようなメッセージ(WM_PAINT)などは呼び出されない。非クライアント領域の描画も可能であり不定形のウィンドウも容易に実装することができる。
レイヤードウィンドウに関する注意点など
- レイヤードウィンドウ作成時は既定のリージョンが設定してある。これは画面の左上・右上の角が丸い矩形である。
- トップレベルウィンドウにのみ利用可能である。子ウィンドウでは使用できない。
- マウスイベントは透明部分では発生しない。
- UpdateLayeredWindowの転送元ビットマップはRGB各プレーンにあらかじめアルファ値を乗算しておかなくてはならない。
- UpdateLayeredWindowでウィンドウサイズの変更や位置を指定できるがその際ウィンドウメッセージ(WM_SIZE,WM_MOVE)は送られない。
- (要調査)DWMを無効化するとレイヤードウィンドウが表示されなくなる(私のコードのBUGかもしれない)。