DWM ブラービハインドの概要

デスクトップ ウィンドウ マネージャー (DWM) の署名効果の 1 つは、半透明でぼやけた非クライアント領域です。 DWM API を使用すると、アプリケーションは最上位ウィンドウのクライアント領域にこれらの効果を適用できます。

注意

Windows Vista Home Basic エディションは、透明グラス効果をサポートしていません。 通常、他の Windows エディションで透明なガラス効果でレンダリングされる領域は、不透明としてレンダリングされます。 Windows 8以降、この関数を呼び出しても、ウィンドウのレンダリング方法のスタイルが変更されるため、ぼかし効果は発生しません。

 

このトピックでは、DWM で有効にする次のクライアントのぼかしシナリオについて説明します。

クライアント領域の特定の領域にぼかしを追加する

アプリケーションは、ウィンドウのクライアント領域全体または特定のサブ領域の背後にぼかし効果を適用できます。 これにより、アプリケーションは、他のアプリケーションとは視覚的に分離されたスタイル付きパスと検索バーを追加できます。

このシナリオで使用される API は DwmEnableBlurBehindWindow 関数であり、 DWM Blur Behind ConstantsDWM_BLURBEHIND 構造体を使用します。

次の関数例は、 EnableBlurBehindウィンドウ全体にぼかし効果を適用する方法を示しています。

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

    // Create and populate the blur-behind structure.
    DWM_BLURBEHIND bb = {0};

    // Specify 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))
    {
        // ...
    }
    return hr;
}

nullhRgnBlur パラメーターで指定されていることに注意してください。 これにより、ウィンドウ全体の背後にぼかしを適用するように DWM に指示されます。

次の図は、ウィンドウ全体に適用されるぼかし効果を示しています。

ウィンドウに適用されるぼかし効果

サブ領域の背後にぼかしを適用するには、DWM_BLURBEHIND構造体のhRgnBlur メンバーに有効な領域ハンドル (HRGN) を適用し、dwFlags メンバーに DWM_BB_BLURREGION フラグを追加します。

ウィンドウのサブ領域にぼかし効果を適用すると、ウィンドウのアルファ チャネルが非基準領域に使用されます。 これにより、ウィンドウの非ブレード領域で予期しない透過性が発生する可能性があります。 したがって、サブ領域にぼかし効果を適用する場合は注意してください。

ウィンドウ フレームをクライアント領域に拡張する

アプリケーションは、ウィンドウ フレームのぼかしをクライアント領域に拡張できます。 これは、ドッキングされたツール バーを使用してウィンドウの背後にぼかし効果を適用したり、アプリケーションの他の部分からコントロールを視覚的に分離したりする場合に便利です。 この機能は、 DwmExtendFrameIntoClientArea 関数によって公開されます。

DwmExtendFrameIntoClientArea を使用してぼかしを有効にするには、MARGINS 構造体を使用して、クライアント領域に拡張する量を示します。 次の関数例では、 ExtendIntoClientBottomクライアント以外のフレームの下部にあるぼかしの拡張機能をクライアント領域に切り替えます。

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

    // Set the margins, extending the bottom margin.
    MARGINS margins = {0,0,0,25};

    // Extend the frame on the bottom of the client area.
    hr = DwmExtendFrameIntoClientArea(hwnd,&margins);
    if (SUCCEEDED(hr))
    {
        // ...
    }
    return hr;
}

次の図は、クライアント領域の下部に拡張されたぼかし効果を示しています。

クライアント領域の下部に拡張されたぼかし効果を示す画像

DwmExtendFrameIntoClientArea メソッドでも使用できます。"ガラスシート" 効果では、ウィンドウの境界線が表示されずにウィンドウの表面全体にぼかし効果が適用されます。 次の例は、クライアント領域がウィンドウの境界線なしでレンダリングされる場合のこの効果を示しています。

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

    // Negative margins have special meaning to DwmExtendFrameIntoClientArea.
    // Negative margins create the "sheet of glass" effect, where the client 
    // area is rendered as a solid surface without a window border.
    MARGINS margins = {-1};

    // Extend the frame across the whole window.
    hr = DwmExtendFrameIntoClientArea(hwnd,&margins);
    if (SUCCEEDED(hr))
    {
        // ...
    }
    return hr;
}

次の図は、"ガラスシート" ウィンドウ スタイルのぼかしを示しています。

デスクトップ ウィンドウ マネージャーの概要

Enable and Control DWM Composition (DWM の構成の有効化と制御)

パフォーマンスに関する考慮事項とベスト プラクティス