Aero Glass2
文字色の問題は原因がわからないので、先にAero GrassAero Glassの方を進めて行きます。
クライアント領域を透明化する方法は、とりあえず2種類あるようです。
- DwmEnableBlurBehindWindow()で指定したregionを透明化。NULLを指定するとクライアント領域全体
- DwmExtendFrameIntoClientArea()でフレーム部分をクライアント内に拡張
準備
- Windows SDK for Windows Vistaをインストール
- dwmapi.h、dwmapi.lib
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でチェックして設定し直す必要があります。
ここまで出来るのであれば、ボタンなどのコントロールもすべて透明化したいですねえ。