DWM Blur Behind Übersicht
Einer der Signatureffekte des Desktopfenster-Managers (DWM) ist ein durchscheinender und verschwommener Nicht-Clientbereich. Mit den DWM-APIs können Anwendungen diese Auswirkungen auf den Clientbereich ihrer Fenster auf oberster Ebene anwenden.
Hinweis
Windows Home Basic-Edition unterstützt den transparenten Glaseffekt nicht. Bereiche, die in anderen Windows-Editionen normalerweise mit dem transparenten Glaseffekt gerendert würden, werden als undurchsichtig gerendert. Ab Windows 8 führt das Aufrufen dieser Funktion aufgrund einer Stiländerung in der Art und Weise, wie Fenster gerendert werden, nicht zu einem Unschärfeneffekt.
In diesem Thema werden die folgenden Clientunschärfeszenarien erläutert, die vom DWM aktiviert werden.
- Hinzufügen von Unschärfe zu einer bestimmten Region des Clientbereichs
- Erweitern des Fensterrahmens in den Clientbereich
- Zugehörige Themen
Eine Anwendung kann den Unschärfeeffekt hinter dem gesamten Clientbereich des Fensters oder auf eine bestimmte Unterregion anwenden. Dadurch können Anwendungen formatierte Pfad- und Suchleisten hinzufügen, die visuell vom Rest der Anwendung getrennt sind.
Die in diesem Szenario verwendete API ist die DwmEnableBlurBehindWindow-Funktion , die die DWM-Unschärfe hinter Konstanten und die DWM_BLURBEHIND-Struktur verwendet.
Die folgende Beispielfunktion veranschaulicht, EnableBlurBehind
wie der Unschärfeneffekt auf das gesamte Fenster angewendet wird.
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;
}
Beachten Sie, dass NULL im hRgnBlur-Parameter angegeben ist. Dadurch wird der DWM aufgefordert, die Unschärfe hinter dem gesamten Fenster anzuwenden.
Die folgende Abbildung veranschaulicht den Unschärfeneffekt, der auf das gesamte Fenster angewendet wird.
Um die Unschärfe hinter einer Unterregion anzuwenden, wenden Sie ein gültiges Regionshandle (HRGN) auf das hRgnBlur-Element der DWM_BLURBEHIND-Struktur an, und fügen Sie dem dwFlags-Member das DWM_BB_BLURREGION-Flag hinzu.
Wenn Sie den Unschärfenbehind-Effekt auf einen Teilbereich des Fensters anwenden, wird der Alphakanal des Fensters für den nicht verblurrten Bereich verwendet. Dies kann zu einer unerwarteten Transparenz im nicht verblurrten Bereich eines Fensters führen. Seien Sie daher vorsichtig, wenn Sie einen Unschärfeeffekt auf einen Teilbereich anwenden.
Eine Anwendung kann die Unschärfe des Fensterrahmens auf den Clientbereich erweitern. Dies ist nützlich, wenn Sie den Unschärfeeffekt hinter einem Fenster mit einer angedockten Symbolleiste anwenden oder Steuerelemente visuell vom Rest einer Anwendung trennen. Diese Funktionalität wird von der DwmExtendFrameIntoClientArea-Funktion verfügbar gemacht.
Um die Unschärfe mithilfe von DwmExtendFrameIntoClientArea zu aktivieren, verwenden Sie die MARGINS-Struktur , um anzugeben, wie viel in den Clientbereich erweitert werden soll. Die folgende Beispielfunktion schaltet ExtendIntoClientBottom
die Unschärfenerweiterung am unteren Rand des Nicht-Clientframes in den Clientbereich ein.
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;
}
Die folgende Abbildung veranschaulicht den Unschärfeneffekt, der sich bis unten im Clientbereich erstreckt.
Auch über die DwmExtendFrameIntoClientArea-Methode ist der Effekt "Glasblatt" verfügbar, bei dem der Unschärfeeffekt auf die gesamte Oberfläche des Fensters ohne sichtbaren Fensterrahmen angewendet wird. Im folgenden Beispiel wird dieser Effekt veranschaulicht, wenn der Clientbereich ohne Fensterrahmen gerendert wird.
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;
}
Die folgende Abbildung veranschaulicht die Unschärfe im Fensterstil "Glasblatt".