こんにちは、開発の福満です。 今日は、Windows 8 で 機能強化された API を試してみたいと思います。
お題は、半透明ウィンドウについてです。コンパイラは Delphi を使用します。
ソースコードとコンパイル済み実行ファイルはこちらからどうぞ。
(ご利用に際しては自己責任にてお願いいたします。)
半透明子ウィンドウ
Windows で半透明のウィンドウを作るには、ウィンドウスタイルに WS_EX_LAYERED を指定しますが、 Windows 7 以前ではトップレベルのウィンドウにのみ指定出来、子ウィンドウには指定出来ませんでした。 ですので、半透明のパネルやボタンを半透明でないウィンドウに配置するということはできませんでした。
今回試したのは下記のコード
procedure TForm1.FormCreate(Sender: TObject); begin ... ... SetLayeredWindowAttr( Panel1.Handle, 150); end; procedure TForm1.SetLayeredWindowAttr(h: THandle; AlphaValue: Integer); var dwExStyle : Cardinal; begin dwExStyle := GetWindowLong( h, GWL_EXSTYLE); dwExStyle := dwExStyle or WS_EX_LAYERED; SetWindowLong( h, GWL_EXSTYLE, dwExStyle); SetLayeredWindowAttributes( h, 0, AlphaValue, LWA_ALPHA); end;
SetWindowLong() でウィンドウスタイルを指定後、SetLayeredWindowAttributes() で透過度を指定します。
実行結果は下記の通り。下部パネルの背面の画像が透けて見えています。
マニフェストの変更
実はこの新しい機能、マニフェストファイルを書き換えないと動きませんでした。 MSDN のサンプルアプリケーションのマニフェストを見て、もしかしてと思い試しに書き換えてみたら動作した次第。 情報もなく苦労しました。
Delphi の実行ファイル存在ディレクトリからデフォルトのマニフェストファイル(default_app.manifest)を持ってきて 上記サンプルのマニフェストを参考に変更し、プロジェクトオプションからカスタムマニフェストを設定しました。
多くの API が追加された Windows 8
Windows 8 では多くの API が追加されています。
機会があればまた何か試して、本ブログで紹介したいと思っています。
SetLayeredWindowAttributes() がトップレベルウィンドウの透過しか出来ずに悔しい思いをされた経験のある方には是非お試しいただけたらと思います。
今後もフェンリル / Sleipnir をよろしくお願いたします。
ソーシャルアカウント
Sleipnir の Facebook ページでは、ユーザーの方たちとのコミュニケーションや最新情報の投稿などをしています。よろしければいいね!してください!
フェンリルのオフィシャル Twitter アカウントでは、フェンリルプロダクトの最新情報などをつぶやいています。よろしければフォローしてください!