【问题标题】:Windows Vista/7 glass completely broken?Windows Vista/7 玻璃完全破碎?
【发布时间】:2011-05-21 00:37:30
【问题描述】:

我正在尝试为应用程序获得媒体播放器玻璃效果,但我面临着各种障碍。是我,还是API?

我先打电话:

MARGINS margins = { -1, -1, -1, -1 };
HRESULT result = ::DwmExtendFrameIntoClientArea(m_hWnd, &margins);

并将背景擦除为黑色:

OnEraseBkgnd

在我添加编辑框之前一切都很好。使用 EditBox,黑色文本出现的地方被玻璃替换。这个问题与更高级的控件(如 ComboBoxEx 等)不成比例。那些开始看起来像一团糟。

这种方法的优点是 alpha 混合图像看起来不错。并逐渐融入玻璃中。

编辑框的解决方案似乎是使用带有 LWA_COLORKEY 的 WS_EX_LAYERED 并使用一些糟糕的颜色进行玻璃遮罩,并将背景擦除为该颜色。不幸的是,这破坏了其他事情。图标上的 alpha 混合看起来超级难看,阴影混合成放射性绿色,而且玻璃本身变得可以点击,即使我在窗口上没有 WS_EX_TRANSPARENT 样式。

第三个建议是使用 GDI+ 进行自定义合成,但这似乎是一种不好的方法,因为 GDI+ 是一种软件后备,我找不到如何将 EditBox 或 ComboBoxEx 渲染到我可以的图像的方法以后作曲用。

我错过了什么吗?

SO 的消息来源似乎也面临同样的问题: link1 link2

【问题讨论】:

  • 您链接到的两个问题似乎与您在此处提出的问题几乎完全相同。你的问题是什么:有人有其他想法吗?
  • 这些问题描述了 RGB(0,0,0) 的部分行为,这似乎被破坏了。我还尝试了通过 WinAPI 机制进行屏蔽,但仍然无法正常工作并导致完全不同但同样错误的结果。所以我仍然想知道是否有人找到了解决方案。
  • GDI 为 24bpp 是核心问题,玻璃效果需要设置 alpha。 Leo 的链接看起来不错。

标签: winapi gdi+ aero dwm aero-glass


【解决方案1】:

Kenny Kerr 写了一篇关于在玻璃上显示控件的优秀文章,以编辑控件为例:

http://weblogs.asp.net/kennykerr/archive/2007/01/23/controls-and-the-desktop-window-manager.aspx

【讨论】:

    【解决方案2】:

    简单的答案是,你不能这样做。

    所有标准控件都使用正常的 GDI 调用来呈现自己。正常的 GDI 调用不知道 alpha,并且大多将 alpha 通道设置为零。

    更复杂的答案是,您可以:网上有一些样品,其中标准对照与航空玻璃混合。它们分为两个基本类别:

    • WinForms (.NET) 示例。 WinForms 实际上并不使用本机控件 - WinForms 控件都是重写版本,除其他功能外,还使用 ​​alpha 感知例程进行 blit。这个example 简单得令人沮丧,让我意识到微软是多么讨厌原生开发者。

    • 子类化示例:让常规/原生控件在航空玻璃上绘制的唯一方法是将控件子类化,捕获 WM_PAINT 消息以创建 DIBBitmap,调用 WM_PRINT 将控件内容渲染到其上。使用 DWM 功能修复 Alpha 通道数据。使用 AlphaBlend 自己绘制生成的 alpha'd bitap。

    This article on CodeProject 包含一个参考实现,它很好地继承了大多数标准控件。

    【讨论】:

    • 在这里开始同意你的看法。尝试了 Kenny Kerr 示例,大多数高级控件有时会变得半透明。例如,当控件被选中时,当您使用 Ctrl+箭头进行选择时,等等。此外,一些控件似乎也忽略了 WM_PRINTCLIENT。在代码中到处撒上 Invalidate 似乎也是一个坏主意,尤其是因为没有人知道传递了哪些消息以及在窗口中以什么顺序传递。
    • +1。在玻璃上绘画很难。您也不应该阅读玻璃上的 ClearType 文本 - 只有 AntiAlias。
    【解决方案3】:

    尝试将编辑框等控件上的文本/前景色更改为“几乎是黑色”的颜色(例如 #010101)。然后您应该能够跳过除图像/图标的 alpha 透明度之外的其他渲染问题。

    编辑:绘制其他东西 - 可能是一些奇怪的处理兼容性的方法,但是经典应用程序默认不是玻璃主题......不知道。如果可能的话,尽量避免自己画东西。

    【讨论】:

    • 那行不通。“几乎是黑色的”只会呈现为“几乎是玻璃”。您所说的“经典应用程序”是什么意思?显然,他正在尝试开发一个适用于 Aero UI 的应用程序。在你宣布它“经典”之前,他甚至不能把它从大门里拿出来?
    • 不,我引用了一些东西来保持旧程序适当地渲染一些东西 - 但正如我所说,这没有任何意义。尝试过一次,我想我能够以某种方式让它在不启用兼容文本渲染的情况下以黑色绘制 - 也许它类似于“1、0、0”(和/或只是不同的 alpha 而不是根本没有 alpha?) . MSDN 建议它完全基于 alpha (msdn.microsoft.com/en-us/magazine/cc163435.aspx)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2010-11-03
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2010-10-02
    相关资源
    最近更新 更多