Mengaktifkan dan mengontrol komposisi DWM
API komposisi Desktop Window Manager (DWM) menyediakan beberapa fungsi untuk mengatur dan mengkueri informasi dasar yang digunakan oleh DWM. API ini memungkinkan Anda untuk mengkueri dan mengubah status komposisi. Selain itu, Anda dapat mengatur dan mengkueri kebijakan penyajian untuk atribut jendela DWM yang berbeda.
Mengambil informasi pewarnaan
Warna wilayah non-klien jendela ditentukan oleh tema warna sistem saat ini. Nilai pewarnaan disediakan melalui API DWM untuk memungkinkan aplikasi Anda mencocokkan UI klien dengan tema warna sistem.
Untuk mengakses nilai pewarnaan ini, dan memantau perubahan warna, gunakan fungsi DwmGetColorizationColor dan pesan WM_DWMCOLORIZATIONCOLORCHANGED .
Contoh ini menunjukkan cara menangani pesan yang diubah warna dan mengakses warna baru.
...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
DWORD newColorizationColor{ (DWORD)wParam };
BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...
Mengontrol penyajian wilayah non-klien
Dua efek visual yang diaktifkan DWM adalah transparansi wilayah non-klien jendela, dan efek transisi. Aplikasi Anda mungkin harus menonaktifkan atau mengaktifkan kembali efek ini karena alasan gaya atau kompatibilitas. Fungsi berikut digunakan untuk mengelola transparansi dan perilaku efek transisi.
Untuk mengambil status penyajian non-klien saat ini untuk jendela aplikasi, panggil DwmGetWindowAttribute dengan dwAttribute diatur ke DWMWA_NCRENDERING_ENABLED. Seperti yang Anda lihat dari dokumentasi untuk DWMWA_NCRENDERING_ENABLED, saat Anda meneruskan bendera tersebut ke DwmGetWindowAttribute, nilai atribut yang diambil berjenis BOOL. Bendera yang berbeda menyebabkan DwmGetWindowAttribute mengembalikan nilai dari berbagai jenis. Berikut adalah contoh kode.
BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_NCRENDERING_ENABLED,
&isNCRenderingEnabled,
sizeof(isNCRenderingEnabled));
Contoh berikutnya menunjukkan cara menggunakan bendera DWMWA_EXTENDED_FRAME_BOUNDS dengan DwmGetWindowAttribute untuk mengambil persegi panjang batas bingkai yang diperluas dari jendela. Dokumentasi untuk bendera tersebut memberi tahu kami bahwa nilai atribut yang diambil berjenis RECT.
RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&extendedFrameBounds,
sizeof(extendedFrameBounds));
Catatan
Ikuti pola pemrograman yang sama yang ditunjukkan di atas saat Anda memanggil DwmGetWindowAttribute dengan bendera untuk atribut yang berbeda. Topik enumerasi DWMWINDOWATTRIBUTE menunjukkan, dalam baris untuk setiap bendera, jenis nilai apa yang harus Anda berikan penunjuk ke dalam parameter pvAttribute untuk DwmGetWindowAttribute. Parameter cbAttribute berisi ukuran, dalam byte, dari objek tersebut.
DwmSetWindowAttribute memungkinkan aplikasi Anda mengatur kebijakan penyajian area non-klien. Fungsi itu juga menentukan bagaimana aplikasi Anda harus menangani efek transisi DWM.
Contoh berikutnya ini menonaktifkan penyajian area non-klien. Ini menyebabkan panggilan sebelumnya ke DwmEnableBlurBehindWindow atau ke DwmExtendFrameIntoClientArea dinonaktifkan.
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;
}
Selain mengontrol penyajian area non-klien, DwmSetWindowAttribute juga dapat mengontrol efek transisi DWM. Anda dapat mengatur perilaku transisi dengan menggunakan DWMWA_TRANSITIONS_FORCEDISABLED sebagai parameter dwAttribute .
Pesan
Pesan berikut memberikan pemberitahuan tentang peristiwa DWM. Pesan-pesan ini dapat digunakan untuk memantau perubahan seperti perubahan status komposisi dan perubahan tema warna sistem.
- WM_DWMCOLORIZATIONCOLORCHANGED
- WM_DWMCOMPOSITIONCHANGED
- WM_DWMNCRENDERINGCHANGED
- WM_DWMWINDOWMAXIMIZEDCHANGE
Menonaktifkan komposisi DWM (Windows 7 dan yang lebih lama)
Peringatan
Info di bagian ini hanya berlaku untuk Windows 7 dan sistem yang lebih lama.
Karena DWM menggunakan unit pemrosesan grafis (GPU) untuk komposisi desktop, aplikasi Anda mungkin harus menonaktifkan DWM untuk kompatibilitas. Aplikasi yang mengambil kendali penuh desktop, seperti game yang berjalan dalam mode layar penuh, harus menentukan apakah DWM diaktifkan dan jika ya, nonaktifkan. Untuk melakukan ini, diperlukan dua fungsi.
Panggilan ke DwmEnableComposition dengan fEnable diatur ke DWM_EC_DISABLECOMPOSITION menonaktifkan komposisi DWM hingga proses panggilan dimatikan, atau komposisi telah diaktifkan kembali dengan memanggil DwmEnableComposition dengan fEnable diatur ke DWM_EC_ENABLECOMPOSITION. Komposisi DWM dimulai ulang secara otomatis segera setelah semua aplikasi yang telah menonaktifkan komposisi telah dimatikan atau memiliki komposisi yang diaktifkan kembali secara manual dengan memanggil DwmEnableComposition.
Catatan
DWM secara otomatis menonaktifkan komposisi ketika aplikasi mencoba menggambar langsung ke permukaan tampilan utama. Komposisi akan dinonaktifkan sampai permukaan perangkat utama dirilis oleh aplikasi tersebut.