Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Jednym z charakterystycznych efektów Desktop Window Manager (DWM) jest przezroczysty i rozmyty obszar niekliencki interfejsu. Interfejs DWM API umożliwia aplikacjom stosowanie tych efektów do obszaru klienta okien najwyższego poziomu.
Uwaga
System Windows Vista Home Basic nie obsługuje przezroczystego efektu szkła. Obszary, które zwykle są renderowane z przezroczystym efektem szkła w innych wersjach systemu Windows, są renderowane jako nieprzezroczyste. Począwszy od systemu Windows 8, wywołanie tej funkcji nie powoduje efektu rozmycia, ze względu na zmianę stylu w sposób renderowania okien.
W tym temacie omówiono następujące scenariusze rozmycia klienta, które umożliwia DWM.
- Dodawanie rozmycia do określonego regionu obszaru klienta
- rozszerzanie ramki okna na obszar klienta
- Tematy pokrewne
Dodawanie rozmycia do określonego regionu obszaru aplikacji.
Aplikacja może użyć efektu rozmycia na całym obszarze klienta okna lub na określonym podobszarze. Umożliwia to aplikacjom dodawanie stylizowanej ścieżki i pasków wyszukiwania, które są wizualnie oddzielone od pozostałej części aplikacji.
Interfejs API używany w tym scenariuszu to funkcja DwmEnableBlurBehindWindow, która korzysta z funkcji DWM Blur Behind Constants i struktury DWM_BLURBEHIND.
Poniższa przykładowa funkcja, EnableBlurBehind
, ilustruje sposób stosowania efektu rozmycia na całe okno.
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;
}
Należy pamiętać, że null jest określony w parametrze hRgnBlur. Dzięki temu dwM ma zastosować rozmycie za całym oknem.
Na poniższej ilustracji przedstawiono efekt rozmycia zastosowany do całego okna.
Aby zastosować rozmycie za podregionem, zastosuj prawidłowy uchwyt regionu (HRGN) do elementu członkowskiego hRgnBlur struktury DWM_BLURBEHIND i dodaj flagę DWM_BB_BLURREGION do elementu członkowskiego dwFlags.
Po zastosowaniu efektu rozmycia do części okna kanał alfa okna jest używany dla obszaru niezmienionego. Może to spowodować nieoczekiwaną przezroczystość w nierozmytej części okna. Dlatego należy zachować ostrożność podczas stosowania efektu rozmycia do podregionu.
Rozszerzanie ramki okna na obszar klienta
Aplikacja może rozszerzyć rozmycie ramki okna na obszar klienta. Pomaga to podczas stosowania efektu rozmycia za oknem z zadokowanym paskiem narzędzi lub wizualnego oddzielenia kontrolki od reszty aplikacji. Ta funkcja jest udostępniana przez funkcję DwmExtendFrameIntoClientArea.
Aby włączyć rozmycie przy użyciu DwmExtendFrameIntoClientArea, użyj struktury MARGINS, aby określić, jak daleko rozszerzyć obszar klienta. Poniższa przykładowa funkcja, ExtendIntoClientBottom
, przełącza rozszerzenie rozmycia z dolnej części ramki nieklienckiej do obszaru klienta.
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;
}
Na poniższej ilustracji przedstawiono efekt rozmycia tła rozciągnięty na dół obszaru roboczego.
Dostępny również za pośrednictwem metody DwmExtendFrameIntoClientArea jest efekt "arkusza szkła", polegający na tym, że efekt rozmycia jest stosowany do całej powierzchni okna bez widocznego obramowania okna. W poniższym przykładzie pokazano ten efekt, w którym obszar klienta jest renderowany bez obramowania okna.
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;
}
Na poniższej ilustracji przedstawiono efekt rozmycia tła w stylu okna "arkusz szkła".
Tematy pokrewne