Desktop Window Manager on Vista

Published 14 July 06 03:26 PM | hiroyuk 

Windows Vista の特徴に半透明のウィンドウ フレームがあります。これは、Aero テーマが有効なときに表示されます。よく見ると、この半透明のウィンドウ フレームの裏側の画像には、ぼかしがかかっています。

このぼかしがかかったウィンドウフレームを広げたり、ウィンドウ背景を全てぼかしがかかった半透明にすることができます。これはデスクトップの合成を司る Windows Desktop Manager の機能の一つであり、それを利用する (Unmanaged の) API が用意されています。

DWM API による背景ぼかし付き半透明ウィンドウの作り方は、SDK ドキュメントでも紹介されていますし、Tim Sneath が彼のブログで Win Form を使った利用方法を説明しています。また、NyaRuRu さんが DirectX で描画した画像の DWM 上での合成を紹介しています。

ここでは、Visual Studio 2005 のテンプレートで作成した Win32 ウィンドウの背景を半透明化する方法を紹介します。

まず、Visual Studio 2005 で C++ の Win32 プロジェクト (Windows アプリケーション) を新規作成し、DWMApi.h のインクルードを宣言して、次の関数をInitInstance() の前に追加します。

HRESULT EnableBlurBehind(HWND hwnd)
{
   HRESULT hr = S_OK;

   //Create and populate the BlurBehind structre
   DWM_BLURBEHIND bb = {0};
   //Enable Blur Behind and Blur Region;
   bb.dwFlags = DWM_BB_ENABLE;
   bb.fEnable = true;
   bb.hRgnBlur = NULL;

   //Enable Blur Behind
   hr = DwmEnableBlurBehindWindow(hwnd, &bb);
   if (SUCCEEDED(hr))
   {
      //do more things
   }
   return hr;
}

そして、InitInstance 関数のShowWindowの前で、次のようにこの関数を呼び出します。

BOOL dwmEnable;
DwmIsCompositionEnabled (&dwmEnable);
if (dwmEnable) EnableBlurBehind(hWnd);

次が一番重要なのですが、MyRegisterClassで背景色のアルファを以下のように設定します。

wcex.hbrBackground = CreateSolidBrush(0xff000000);

リンクに DWMApi.lib を追加してビルド・実行してください。背景ぼかし付き半透明ウィンドウが現れます。この色とアルファを調整すれば次のようなウィンドウも表示できます。もちろん Windows Vista じゃないと動かないのでご注意ください。

Filed under:

Comments

# 青柳臣一 blog : .NET や C# がメインの blog said on July 19, 2006 5:27 AM:
Windows.Forms なアプリを glass にする その2
Anonymous comments are disabled

About hiroyuk

マイクロソフト㈱エバンジェリスト。北海道大学理学部物理学科卒。リアルタイム3Dグラフィックスを専門とし、グラフィックスやシェーダに関する技術文章を執筆・講演。 DirectX SDK日本語ドキュメントの開発に携わるとともに、Windows Presentation Foundation プログラミング(オーム社)、Game Programming Gemsシリーズ、リアルタイム レンダリング第2版(ボーンデジタル)、Texturing & Modeling, A Procedural Approach などを翻訳・監修、XAMLプログラミング(ソフトバンク クリエイティブ)を執筆。趣味は薪割り。

Search

This Blog

DirectX 情報

Silverlight 情報

Windows 情報

WPF 情報

並列コンピューティング情報

著書

Syndication

Page view tracker