Desktop Window Manager on Vista

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 じゃないと動かないのでご注意ください。