Gambaran Umum DWM Blur Behind
Salah satu efek Signature Desktop Window Manager (DWM) adalah area non-klien yang tembus cahaya dan kabur. API DWM memungkinkan aplikasi untuk menerapkan efek ini ke area klien dari jendela tingkat atasnya.
Catatan
Windows Vista Home Basic edition tidak mendukung efek kaca transparan. Area yang biasanya akan dirender dengan efek kaca transparan pada edisi Windows lainnya dirender sebagai buram. Dimulai dengan Windows 8, memanggil fungsi ini tidak mengakibatkan efek kabur, karena perubahan gaya dalam cara jendela dirender.
Topik ini membahas skenario blur-behind klien berikut yang diaktifkan DWM.
- Menambahkan Kabur ke Wilayah Tertentu dari Area Klien
- Memperluas Bingkai Jendela ke Area Klien
- Topik terkait
Aplikasi dapat menerapkan efek kabur di belakang seluruh wilayah klien jendela atau ke subregion tertentu. Ini memungkinkan aplikasi untuk menambahkan jalur bergaya dan bilah pencarian yang secara visual terpisah dari aplikasi lainnya.
API yang digunakan dalam skenario ini adalah fungsi DwmEnableBlurBehindWindow , yang menggunakan DWM Blur Behind Constants dan struktur DWM_BLURBEHIND .
Contoh fungsi berikut, EnableBlurBehind
, menggambarkan cara menerapkan efek blur-behind ke seluruh jendela.
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;
}
Perhatikan bahwa NULL ditentukan dalam parameter hRgnBlur . Ini memberi tahu DWM untuk menerapkan kabur di belakang seluruh jendela.
Gambar berikut mengilustrasikan efek blur-behind yang diterapkan ke seluruh jendela.
Untuk menerapkan pengaburan di belakang subregion, terapkan handel wilayah yang valid (HRGN) ke anggota hRgnBlur dari struktur DWM_BLURBEHIND dan tambahkan bendera DWM_BB_BLURREGION ke anggota dwFlags .
Saat Anda menerapkan efek blur-behind ke subregion jendela, saluran alfa jendela digunakan untuk area yang tidak dibedakan. Ini dapat menyebabkan transparansi tak terduga di wilayah jendela yang tidak terduga. Oleh karena itu, berhati-hatilah ketika Anda menerapkan efek kabur ke subregion.
Aplikasi dapat memperluas kabur bingkai jendela ke area klien. Ini berguna ketika Anda menerapkan efek kabur di belakang jendela dengan toolbar yang ditambakan atau kontrol yang terpisah secara visual dari aplikasi lainnya. Fungsionalitas ini diekspos oleh fungsi DwmExtendFrameIntoClientArea .
Untuk mengaktifkan kabur dengan menggunakan DwmExtendFrameIntoClientArea, gunakan struktur MARGINS untuk menunjukkan berapa banyak yang harus diperluas ke area klien. Contoh fungsi berikut, ExtendIntoClientBottom
, mengalihkan ekstensi kabur di bagian bawah bingkai non-klien ke area klien.
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;
}
Gambar berikut mengilustrasikan efek blur-behind yang diperluas ke bagian bawah area klien.
Juga tersedia melalui metode DwmExtendFrameIntoClientArea adalah efek "lembar kaca", di mana efek kabur diterapkan ke seluruh permukaan jendela tanpa batas jendela yang terlihat. Contoh berikut menunjukkan efek ini di mana area klien dirender tanpa batas jendela.
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;
}
Gambar berikut mengilustrasikan blur-behind dalam gaya jendela "lembar kaca".