【问题标题】:Is there any way to fix the side effect of "DwmEnableBlurBehindWindow" in VC6.0?有什么办法可以解决VC6.0中“DwmEnableBlurBehindWindow”的副作用?
【发布时间】:2012-06-18 06:39:23
【问题描述】:

我遇到了 MSDN 主题中提到的一个确切问题:DWM Blur Behind Overview

在调用 DwmEnableBlurBehindWindow 之后,客户区变成了漂亮的玻璃,但不幸的是,控件(按钮、编辑、静态等)上的所有黑色文本也变得透明,就像 Topic on MSDN 一样。

有什么办法解决这个问题?

顺便说一句,我的开发环境是VC++ 6.0,我必须用DrawThemeTextEx API绘制一些发光的文字,所以我不能简单地使用DwmExtendFrameIntoClientArea。我必须使用 DwmEnableBlurBehindWindow 来启用客户区域的玻璃效果。

非常感谢!

2012/6/19 更新: 通过使用“SetLayeredWindowAttributes”将窗口的 TRANSPARENT KEY COLOR 更改为非黑色,然后使用“DwmExtendFrameIntoClientArea”可以解决玻璃窗口上的 CONTROLS(BUTTONs、EDITs 等)的标题文本问题。

但是这样一来,“DrawThemeTextEx”就不能正常工作了。看起来 DrawThemeTextEx 只能使用 RGB(0,0,0) 作为其透明键颜色。

那么,是否有任何 API 可以更改“DrawThemeTextEx”在内部使用的 TRANSPARENT KEY COLOR?

我的最终目标是在没有 MSDN 主题中提到的“DwmEnableBlurBehindWindow”副作用的玻璃(Aero)窗口上绘制一些发光文本:DWM Blur Behind Overview,http://msdn.microsoft.com/en-我们/图书馆/aa969537.aspx。 如果有其他方法可以做到这一点,我很高兴听到:)

非常感谢,再次! :)

【问题讨论】:

  • VC6与它无关,常用控件使用GDI,GDI不支持alpha通道...
  • 我提到 VC6 的原因是我必须以动态方式使用 DWM API。而且整个 MSDEV 也没有 VS2008 或更高版本那么好用。
  • 恕我直言,使用颜色键不是可行的方法,因为您需要选择一种颜色,该颜色不属于主题/VS 并且未在您可能拥有的任何图形/图标中使用...
  • 是的,我选择了 TRANSPARENT KEY COLOR:RGB(200, 201, 202) 以使所有文本在 CONTROLS 上正确显示。但同时,“DrawThemeTextEx”也无法正常工作。而且我真的很累.....我的目标是让“DrawThemeTextEx”和“DwmExtendFrameIntoClientArea”同时工作正常。 :(
  • 如果文本系统颜色是 RGB(200, 201, 202) ?

标签: c++ windows api dwm


【解决方案1】:

看看MSDN中的Painting the caption title

在示例中找到HBITMAP hbmOld = (HBITMAP)SelectObject(hdcPaint, hbm); 行。

然后,在其后面添加这一行:

// You should have set RGB(200,201,202) as the transparency key
FillRect(hdcPaint,&rcClient,CreateSolidBrush(RGB(200,201,202)));

虽然效果看起来不完美,但是解决了问题。

参考:C++ WinAPI Conflict between SetLayeredWindowAttributes and BitBlt

【讨论】:

    猜你喜欢
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2011-11-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多