DWM 模糊後置概觀

其中一個簽章桌面視窗管理員 (DWM) 效果是半透明且模糊的非工作區。 DWM API 可讓應用程式將這些效果套用至其最上層視窗的工作區。

注意

Windows Vista Home Basic 版本不支援透明玻璃效果。 通常會在其他 Windows 版本上呈現透明玻璃效果的區域會轉譯為不透明。 從Windows 8開始,呼叫此函式不會產生模糊效果,因為視窗轉譯的方式有樣式變更。

 

本主題討論 DWM 啟用的下列用戶端模糊後置案例。

將模糊新增至工作區的特定區域

應用程式可以將模糊效果套用到視窗的整個用戶端區域,或套用至特定的子系。 這可讓應用程式新增樣式路徑和搜尋列,以視覺化方式與應用程式的其餘部分分開。

此案例中使用的 API 是 DwmEnableBlurBehindWindow 函式,它會使用 DWM Blur Behind 常數DWM_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;
}

請注意, Null 是在 hRgnBlur 參數中指定。 這會告訴 DWM 將模糊套用到整個視窗後面。

下圖說明套用至整個視窗的模糊後置效果。

套用至視窗的模糊後置效果

若要在DWM_BLURBEHIND結構後面套用模糊,請將有效的區域控制碼套用 (HRGN) 至DWM_BLURBEHIND結構的hRgnBlur成員,並將DWM_BB_BLURREGION旗標新增至dwFlags成員。

當您將模糊後置效果套用至視窗的子系時,視窗的 Alpha 色板會用於非藍色區域。 這可能會在視窗的非Blblurred 區域中造成非預期的透明度。 因此,當您將模糊效果套用至子子時,請小心。

將視窗框架延伸至工作區

應用程式可以將視窗框架的模糊延伸至工作區。 當您使用停駐工具列在視窗後方套用模糊效果,或以視覺化方式將控制項與應用程式的其餘部分分開時,這非常有用。 此功能是由 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 組合)

效能考慮和最佳做法