【问题标题】:DwmEnableBlurBehindWindow makes the entire client area transparentDwmEnableBlurBehindWindow 使整个客户区透明
【发布时间】:2013-01-29 12:22:13
【问题描述】:

航空玻璃会导致很多人在尝试使用它时遇到问题。任何 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));

【问题讨论】:

    标签: winapi aero-glass


    【解决方案1】:

    来自 MSDN 库文章:

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

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

    【讨论】:

    • 是的,仔细阅读我还发现“当您将模糊效果应用于窗口的子区域时,窗口的 Alpha 通道用于非模糊区域。这可能会导致意外窗口非模糊区域的透明度。因此,在对子区域应用模糊效果时要小心。当。 DWM 还有一种“尊重” alpha 的奇怪方式,因为在 alpha 254 时它基本上是不透明的,但在 alpha 255 时它会进行加法混合,正如我用 GDI+ 测试过的那样。
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 2012-05-04
    • 2011-06-16
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多