Abilitare e controllare la composizione DWM
Le API di composizione di Desktop Window Manager (DWM) forniscono diverse funzioni per l'impostazione e l'esecuzione di query per informazioni di base usate dalla DWM. Queste API consentono di eseguire query e modificare lo stato di composizione. È inoltre possibile impostare ed eseguire query sui criteri di rendering per diversi attributi della finestra DWM.
Recupero delle informazioni sulla colorazione
Il colore dell'area non client di una finestra è determinato dal tema del colore del sistema corrente. Il valore di colorazione viene fornito tramite le API DWM per consentire all'applicazione di corrispondere all'interfaccia utente client con il tema del colore del sistema.
Per accedere a questo valore di colorazione e monitorare la modifica del colore, usare la funzione DwmGetColorizationColorizationColor e il messaggio di WM_DWMCOLORIZATIONCOLORCHANGED .
In questo esempio viene illustrato come gestire il messaggio di modifica del colore e accedere al nuovo colore.
...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
DWORD newColorizationColor{ (DWORD)wParam };
BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...
Controllo del rendering dell'area non client
Due degli effetti visivi abilitati da DWM sono trasparenza dell'area non client di una finestra e degli effetti di transizione. L'applicazione potrebbe dover disabilitare o riabilitare questi effetti per motivi di stile o compatibilità. Le funzioni seguenti vengono usate per gestire il comportamento degli effetti di trasparenza e transizione.
Per recuperare lo stato di rendering non client corrente per la finestra di un'applicazione, chiamare DwmGetWindowAttribute con dwAttribute impostato su DWMWA_NCRENDERING_ENABLED. Come si può vedere dalla documentazione per DWMWA_NCRENDERING_ENABLED, quando si passa tale flag a DwmGetWindowAttribute, il valore dell'attributo recuperato è di tipo BOOL. Flag diversi causano la restituzione di valori di diversi tipi da parte di DwmGetWindowAttribute . Ecco un esempio di codice.
BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_NCRENDERING_ENABLED,
&isNCRenderingEnabled,
sizeof(isNCRenderingEnabled));
Questo esempio seguente illustra come usare il flag DWMWA_EXTENDED_FRAME_BOUNDS con DwmGetWindowAttribute per recuperare il rettangolo dei limiti di fotogrammi estesi di una finestra. La documentazione per tale flag indica che il valore dell'attributo recuperato è di tipo RECT.
RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&extendedFrameBounds,
sizeof(extendedFrameBounds));
Nota
Seguire lo stesso modello di programmazione illustrato sopra quando si chiama DwmGetWindowAttribute con flag per attributi diversi. L'argomento di enumerazione DWMWINDOWATTRIBUTE indica, nella riga per ogni flag, quale tipo di valore è necessario passare un puntatore a nel parametro pvAttribute per DwmGetWindowAttribute. Il parametro cbAttribute contiene le dimensioni, in byte, di tale oggetto.
DwmSetWindowAttribute consente all'applicazione di impostare i criteri di rendering dell'area non client. Tale funzione determina anche come l'applicazione deve gestire gli effetti di transizione DWM.
Questo esempio successivo disabilita il rendering dell'area non client. In questo modo tutte le chiamate precedenti a DwmEnableBlurBehindWindow o a DwmExtendFrameIntoClientArea devono essere disabilitate.
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;
}
Oltre a controllare il rendering dell'area non client, DwmSetWindowAttribute può anche controllare gli effetti di transizione DWM. È possibile impostare il comportamento di transizione usando DWMWA_TRANSITIONS_FORCEDISABLED come parametro dwAttribute .
Messaggi
I messaggi seguenti forniscono una notifica degli eventi DWM. Questi messaggi possono essere usati per monitorare le modifiche, ad esempio modifiche dello stato di composizione e modifiche del tema del colore di sistema.
- WM_DWMCOLORIZATIONCOLORCHANGED
- WM_DWMCOMPOSITIONCHANGED
- WM_DWMNCRENDERINGCHANGED
- WM_DWMWINDOWMAXIMIZEDCHANGE
Disabilitazione della composizione DWM (Windows 7 e versioni precedenti)
Avviso
Le informazioni contenute in questa sezione si applicano solo ai sistemi Windows 7 e precedenti.
Poiché DWM usa l'unità di elaborazione grafica (GPU) per la composizione desktop, l'applicazione potrebbe dover disabilitare DWM per la compatibilità. Le applicazioni che controllano completamente il desktop, ad esempio i giochi che vengono eseguiti in modalità schermo intero, devono determinare se il DWM è abilitato e, se è, disabilitarlo. A tale scopo, sono necessarie due funzioni.
Una chiamata a DwmEnableComposition con fEnable impostata su DWM_EC_DISABLECOMPOSITION disabilita la composizione DWM fino a quando il processo chiamante non è stato arrestato o la composizione è stata riabilitata chiamando DwmEnableComposition con fEnable impostato su DWM_EC_ENABLECOMPOSITION. La composizione DWM viene riavviata automaticamente non appena tutte le applicazioni con composizione disabilitata hanno arrestato o hanno una composizione abilitata manualmente chiamando DwmEnableComposition.
Nota
DWM disabilita automaticamente la composizione quando un'applicazione tenta di disegnare direttamente all'area di visualizzazione primaria. La composizione verrà disabilitata fino a quando l'area del dispositivo primario non viene rilasciata da tale applicazione.