Panoramica di DWM Blur
Uno degli effetti di Desktop Window Manager (DWM) di firma è un'area traslucente e sfocata non client. Le API DWM consentono alle applicazioni di applicare questi effetti all'area client delle finestre di primo livello.
Nota
Windows Vista Home Basic edition non supporta l'effetto vetro trasparente. Le aree che in genere eseguirebbero il rendering con l'effetto trasparente del vetro su altre edizioni di Windows vengono rese opache. A partire da Windows 8, la chiamata di questa funzione non comporta l'effetto blur, a causa di una modifica dello stile nel modo in cui vengono sottoposti a rendering le finestre.
In questo argomento vengono illustrati gli scenari seguenti di blur-behind del client abilitati da DWM.
- Aggiunta di blur a un'area specifica dell'area client
- Estensione del frame finestra nell'area client
- Argomenti correlati
Un'applicazione può applicare l'effetto blur dietro l'intera area client della finestra o a una sottoregion specifica. In questo modo, le applicazioni possono aggiungere barre di ricerca e percorso in stile separate visivamente dal resto dell'applicazione.
L'API usata in questo scenario è la funzione DwmEnableBlurBehindWindow , che usa la struttura DWM Blur Behind Constants e la struttura DWM_BLURBEHIND .
La funzione di esempio seguente, EnableBlurBehind
, illustra come applicare l'effetto blur-behind all'intera finestra.
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;
}
Si noti che NULL viene specificato nel parametro hRgnBlur . Questo indica al DWM di applicare il blur dietro l'intera finestra.
L'immagine seguente illustra l'effetto blur-behind applicato all'intera finestra.
Per applicare il blur dietro una sottoregion, applicare un handle di area (HRGN) valido al membro hRgnBlur della struttura DWM_BLURBEHIND e aggiungere il flag DWM_BB_BLURREGION al membro dwFlags.
Quando si applica l'effetto blur-behind a una sottoregion della finestra, il canale alfa della finestra viene usato per l'area non bidirezionale. Ciò può causare una trasparenza imprevista nell'area non secondaria di una finestra. Prestare quindi attenzione quando si applica un effetto blu a una sottoregion.
Un'applicazione può estendere il blur della cornice della finestra nell'area client. Ciò è utile quando si applica l'effetto sfocatura dietro una finestra con una barra degli strumenti ancorata o controlli visivamente separati dal resto di un'applicazione. Questa funzionalità viene esposta dalla funzione DwmExtendFrameIntoClientArea .
Per abilitare il blur usando DwmExtendFrameIntoClientArea, usare la struttura MARGIN per indicare quanto estendere nell'area client. La funzione di esempio seguente, ExtendIntoClientBottom
, attiva l'estensione blur nella parte inferiore del frame non client nell'area client.
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;
}
L'immagine seguente illustra l'effetto blur-behind esteso nella parte inferiore dell'area client.
Disponibile anche tramite il metodo DwmExtendFrameIntoClientArea è l'effetto "foglio di vetro", dove l'effetto blur viene applicato all'intera superficie della finestra senza un bordo finestra visibile. Nell'esempio seguente viene illustrato questo effetto in cui viene eseguito il rendering dell'area client senza un bordo finestra.
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;
}
L'immagine seguente illustra il blur-behind nello stile della finestra "foglio di vetro".