Sdílet prostřednictvím


Povolení a řízení složení DWM

Rozhraní API pro složení Desktop Window Manageru (DWM) poskytují několik funkcí pro nastavení a dotazování základních informací, které používá DWM. Tato rozhraní API umožňují dotazovat se a měnit stav složení. Kromě toho můžete nastavit a dotazovat zásady vykreslování pro různé atributy okna DWM.

Načítání informací o zabarvení

Barva oblasti okna, která není klientem, je určena aktuálním barevným motivem systému. Hodnota zabarvení se poskytuje prostřednictvím rozhraní API DWM, aby vaše aplikace mohla odpovídat uživatelskému rozhraní klienta s barevným motivem systému.

Pokud chcete získat přístup k této hodnotě zabarvení a sledovat změnu barvy, použijte funkci DwmGetColorizationColor a zprávu WM_DWMCOLORIZATIONCOLORCHANGED.

Tento příklad ukazuje, jak zpracovat změněnou barvu zprávy a získat přístup k nové barvě.

...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
    DWORD newColorizationColor{ (DWORD)wParam };
    BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...

Řízení vykreslování oblastí mimo klienta

Dva vizuální efekty, které DWM umožňuje, jsou průhlednost oblasti, která není klientem okna, a přechodové efekty. Aplikace může tyto efekty zakázat nebo znovu povolit z důvodů stylu nebo kompatibility. Následující funkce slouží ke správě chování průhlednosti a efektu přechodu.

Pokud chcete načíst aktuální stav vykreslování mimo klienta pro okno aplikace, zavolejte DwmGetWindowAttribute s dwAttribute nastavenou na DWMWA_NCRENDERING_ENABLED. Jak vidíte v dokumentaci pro DWMWA_NCRENDERING_ENABLED, při předání tohoto příznaku do DwmGetWindowAttribute, načtená hodnota atributu je typu BOOL. Různé příznaky způsobují, DwmGetWindowAttribute vrátit hodnoty různých typů. Tady je příklad kódu.

BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
    DWMWA_NCRENDERING_ENABLED,
    &isNCRenderingEnabled,
    sizeof(isNCRenderingEnabled));

Tento další příklad ukazuje, jak použít příznak DWMWA_EXTENDED_FRAME_BOUNDS s DwmGetWindowAttribute k načtení obdélníku rozšířených rámečků okna. Dokumentace pro tento příznak nám říká, že hodnota načteného atributu je typu RECT.

RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
    DWMWA_EXTENDED_FRAME_BOUNDS,
    &extendedFrameBounds,
    sizeof(extendedFrameBounds));

Poznámka

Při volání DwmGetWindowAttribute s příznaky pro různé atributy postupujte podle stejného programovacího vzoru uvedeného výše. DWMWINDOWATTRIBUTE tématu výčtu označuje, v řádku pro každý příznak, jaký typ hodnoty byste měli předat ukazatel do parametru pvAttribute pro DwmGetWindowAttribute. Parametr cbAttribute obsahuje velikost objektu v bajtech.

DwmSetWindowAttribute umožňuje vaší aplikaci nastavit zásady vykreslování oblasti mimo klienta. Tato funkce také určuje, jak by vaše aplikace měla zpracovávat efekty přechodu DWM.

Tento další příklad zakáže vykreslování oblastí mimo klienta. To způsobí, že se všechna předchozí volání DwmEnableBlurBehindWindow nebo DwmExtendFrameIntendFrameIntoClientArea zakázána.

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;
}

Kromě řízení vykreslování oblasti klienta může DwmSetWindowAttribute také řídit přechodové efekty DWM. Chování přechodu můžete nastavit pomocí DWMWA_TRANSITIONS_FORCEDISABLED jako parametru dwAttribute.

Zprávy

Následující zprávy poskytují oznámení o událostech DWM. Tyto zprávy lze použít k monitorování změn, jako jsou změny stavu složení a změny barevného motivu systému.

Zakázání složení DWM (Windows 7 a starší)

Varování

Informace v této části platí jenom pro Windows 7 a starší systémy.

Vzhledem k tomu, že DWM používá grafický procesor (GPU) ke složení plochy, může být nutné, aby vaše aplikace zakázala dwm kvůli kompatibilitě. Aplikace, které mají plnou kontrolu nad plochou, jako jsou hry spuštěné v režimu zobrazení na celé obrazovce, musí určit, jestli je dwM povolená a jestli je, zakažte ji. K tomu jsou potřeba dvě funkce.

Volání DwmEnableComposition s fEnable nastavenou na DWM_EC_DISABLECOMPOSITION zakáže složení DWM, dokud se volající proces nevypnul, nebo se složení znovu povolilo voláním DwmEnableComposition s fEnable nastaveným na DWM_EC_ENABLECOMPOSITION. Složení DWM se automaticky restartuje, jakmile všechny aplikace, které mají zakázané složení, buď vypnout nebo ručně znovu povolit složení voláním DwmEnableComposition.

Poznámka

DWM automaticky zakáže složení, když se aplikace pokusí nakreslit přímo na primární plochu displeje. Složení bude zakázané, dokud tato aplikace nevolní plochu primárního zařízení.