DwmEnableBlurBehindWindow使整个客户区域透明

时间:2013-02-13 20:16:35

标签: winapi aero-glass

航空玻璃会导致很多人试图利用它。 alpha值为255的任何内容似乎都被DWM视为透明,使用添加模糊来绘制它。我希望客户区的一部分使用Aero玻璃,其余部分被视为不透明,所以我不必处理常见控件的头痛问题,而不能正常渲染。

MSDN列出了一个函数DwmEnableBlurBehindWindow,它允许您将部分客户区标记为DWM模糊。它需要一个DWM_BLURBEHIND指针,该指针具有窗口区域的HRGN句柄。当我使用此功能时,整个窗口变得透明,带有添加剂混合,但只有我传递给DwmEnableBlurBehindWindow的窗口区域变得模糊。有没有办法可以让窗户的其余部分变得透明?

我看起来有点像:

blur.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
blur.hRgnBlur = CreateRectRgn(0, 0, 90, 90);
blur.fEnable = true;
DwmEnableBlurBehindWindow(hwnd, &blur);
RECT rect;
GetClientArea(&rect);
FillRect(hdc, &rect, CreateSolidBrush(0));

1 个答案:

答案 0 :(得分:1)

来自MSDN Library文章:

  

窗口中的alpha值受到尊重,模糊顶部的渲染将使用这些alpha值。应用程序的责任是确保窗口中所有像素的alpha值正确。一些GDI操作不能保持alpha值,因此在呈现子窗口时必须小心,因为它们贡献的alpha值是不可预测的。

制作大多数 GDI操作,例如FillRect()。您创建的画笔使用24位颜色绘制,alpha将为0.这使窗口透明。你需要切换到GDI +。文字特别麻烦。以及传统的Windows控件,例如使用GDI绘制的EDIT和LISTBOX。