Włączanie i kontrolowanie kompozycji DWM
Interfejsy API kompozycji menedżera okien pulpitu (DWM) udostępniają kilka funkcji ustawiania i wykonywania zapytań dotyczących podstawowych informacji używanych przez usługę DWM. Te interfejsy API umożliwiają wykonywanie zapytań i zmienianie stanu kompozycji. Ponadto można ustawić i wykonać zapytanie dotyczące zasad renderowania dla różnych atrybutów okna DWM.
Pobieranie informacji o kolorowaniu
Kolor regionu innego niż klient okna jest określany przez bieżący motyw kolorów systemu. Wartość kolorowania jest dostarczana za pośrednictwem interfejsów API usługi DWM, aby umożliwić aplikacji dopasowanie interfejsu użytkownika klienta z motywem kolorów systemu.
Aby uzyskać dostęp do tej wartości kolorowania i monitorować zmianę koloru, użyj funkcji DwmGetColorizationColorizationColor i komunikatu WM_DWMCOLORIZATIONCOLORCHANGED.
W tym przykładzie pokazano, jak obsługiwać zmieniony kolor i uzyskiwać dostęp do nowego koloru.
...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
DWORD newColorizationColor{ (DWORD)wParam };
BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...
Kontrolowanie renderowania regionów innych niż klient
Dwa efekty wizualne, które umożliwia DWM, to przezroczystość regionu innego niż klient okna i efekty przejścia. Aplikacja może być konieczna do wyłączenia lub ponownego włączenia tych efektów ze względów stylu lub zgodności. Następujące funkcje służą do zarządzania zachowaniem efektu przezroczystości i przejścia.
Aby pobrać bieżący stan renderowania innego niż klient dla okna aplikacji, wywołaj DwmGetWindowAttribute z dwAttribute ustawioną na DWMWA_NCRENDERING_ENABLED. Jak widać w dokumentacji DWMWA_NCRENDERING_ENABLED, po przekazaniu tej flagi do DwmGetWindowAttribute, pobrana wartość atrybutu jest typu BOOL. Różne flagi powodują, że DwmGetWindowAttribute zwracać wartości różnych typów. Oto przykład kodu.
BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_NCRENDERING_ENABLED,
&isNCRenderingEnabled,
sizeof(isNCRenderingEnabled));
W następnym przykładzie pokazano, jak użyć flagi DWMWA_EXTENDED_FRAME_BOUNDS z DwmGetWindowAttribute, aby pobrać prostokąt granic rozszerzonej ramki okna. Dokumentacja tej flagi informuje nas, że pobrana wartość atrybutu jest typu RECT.
RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&extendedFrameBounds,
sizeof(extendedFrameBounds));
Nuta
Postępuj zgodnie z tym samym wzorcem programowania pokazanym powyżej podczas wywoływania DwmGetWindowAttribute z flagami dla różnych atrybutów. Temat wyliczenia DWMWINDOWATTRIBUTE wskazuje w wierszu dla każdej flagi, jaki typ wartości należy przekazać do parametru pvAttribute dla DwmGetWindowAttribute. Parametr cbAttribute zawiera rozmiar w bajtach tego obiektu.
DwmSetWindowAttribute umożliwia aplikacji ustawienie zasad renderowania obszaru innego niż klient. Ta funkcja określa również, jak aplikacja powinna obsługiwać efekty przejścia DWM.
W następnym przykładzie wyłączono renderowanie obszaru innego niż klient. Powoduje to wyłączenie wszystkich poprzednich wywołań DwmEnableBlurBehindWindow lub DwmExtendFrameIntoClientArea.
HRESULT DisableNCRendering(HWND hWnd)
{
HRESULT hr = S_OK;
DWMNCRENDERINGPOLICY ncrp = DWMNCRP_DISABLED;
// Disable non-client area rendering on the window.
hr = ::DwmSetWindowAttribute(hWnd,
DWMWA_NCRENDERING_POLICY,
&ncrp,
sizeof(ncrp));
if (SUCCEEDED(hr))
{
// ...
}
return hr;
}
Oprócz kontrolowania renderowania obszaru innego niż klient, DwmSetWindowAttribute może również kontrolować efekty przejścia DWM. Zachowanie przejścia można ustawić przy użyciu DWMWA_TRANSITIONS_FORCEDISABLED jako parametru dwAttribute.
Wiadomości
Następujące komunikaty zawierają powiadomienie o zdarzeniach DWM. Te komunikaty mogą służyć do monitorowania zmian, takich jak zmiany stanu kompozycji i zmiany motywu kolorów systemu.
- WM_DWMCOLORIZATIONCOLORCHANGED
- WM_DWMCOMPOSITIONCHANGED
- WM_DWMNCRENDERINGCHANGED
- WM_DWMWINDOWMAXIMIZEDCHANGE
Wyłączanie kompozycji DWM (system Windows 7 i starsze)
Ostrzeżenie
Informacje w tej sekcji dotyczą tylko systemów Windows 7 i starszych.
Ponieważ usługa DWM używa jednostki przetwarzania grafiki (GPU) do tworzenia pulpitu, aplikacja może być musiała wyłączyć usługę DWM w celu zapewnienia zgodności. Aplikacje, które przejmą pełną kontrolę nad pulpitem, takie jak gry uruchamiane w trybie pełnoekranowym, muszą określić, czy usługa DWM jest włączona, a jeśli tak, wyłącz ją. W tym celu potrzebne są dwie funkcje.
Wywołanie DwmEnableComposition z fEnable ustawione na DWM_EC_DISABLECOMPOSITION wyłącza kompozycję DWM do momentu zamknięcia procesu wywoływania lub ponownego włączenia kompozycji przez wywołanie DwmEnableComposition z fEnable ustawioną na DWM_EC_ENABLECOMPOSITION. Kompozycja DWM jest uruchamiana automatycznie, gdy tylko wszystkie aplikacje, które wyłączyły kompozycję, zostały zamknięte lub ręcznie ponownie włączone kompozycje przez wywołanie DwmEnableComposition.
Nuta
Usługa DWM automatycznie wyłącza kompozycję, gdy aplikacja próbuje rysować bezpośrednio na powierzchnię wyświetlania podstawowego. Kompozycja zostanie wyłączona do momentu wydania przez aplikację podstawowej powierzchni urządzenia.