Windows Vista / 7玻璃完全坏了吗?

时间:2010-12-06 14:32:40

标签: winapi gdi+ aero dwm aero-glass

我正在尝试为应用程序获取媒体播放器玻璃效果,但我面临着各种障碍。是我,还是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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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包含一个参考实现,它可以很好地对大多数标准控件进行子类化。

答案 2 :(得分:0)

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

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