Aero Glass2

文字色の問題は原因がわからないので、先にAero GrassAero Glassの方を進めて行きます。

クライアント領域を透明化する方法は、とりあえず2種類あるようです。

  • DwmEnableBlurBehindWindow()で指定したregionを透明化。NULLを指定するとクライアント領域全体
  • DwmExtendFrameIntoClientArea()でフレーム部分をクライアント内に拡張

準備

DwmEnableBlurBehindWindow

regionにNULLを指定して、クライアント領域全体を透明化します。

DWM_BLURBEHIND bb = { 0 };
bb.dwFlags = DWM_BB_ENABLE;      //有効なメンバを示すフラグ(今回はfEnableのみ)
bb.fEnable = TRUE;
DwmEnableBlurBehindWindow( hwnd, &bb );
実行結果

DwmExtendFrameIntoClientArea

フレームをクライアント領域に拡張する際のmarginを設定します。

MARGINS margin = { 0, 0, 50, 0 }; //左、右、上、下のマージン
DwmExtendFrameIntoClientArea( hwnd, &margin );
実行結果

マージンの設定で-1を指定すると、クライアント領域全体に拡張されます。

MARGINS margin = { -1 };
DwmExtendFrameIntoClientArea( hwnd, &margin );
実行結果

DwmIsCompositionEnabled でDWM合成が有効か調べる

実際に使用する場合は、DwmEnableBlurBehindWindow、DwmExtendFrameIntoClientAreaを呼び出す前にDWM合成が有効かどうか調べる必要があります。

BOOL enable = FALSE;
DwmIsCompositionEnabled( &enable );
if( enable )
{
    //使用可能
}

WM_DWMCOMPOSITIONCHANGED

アプリケーション実行中にDWMが有効化・無効化されたとき、ウィンドウにWM_DWMCOMPOSITIONCHANGEDメッセージが送られるので、DwmIsCompositionEnabledでチェックして設定し直す必要があります。



ここまで出来るのであれば、ボタンなどのコントロールもすべて透明化したいですねえ。