Windows Vista/7玻璃完全破碎?

问题描述:

我试图让一个应用程序的媒体播放器的玻璃效果,但我周围的所有路障面对。是我,还是API?Windows Vista/7玻璃完全破碎?

我开始拨打:

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

和擦除背景黑色:

OnEraseBkgnd 

一切都很好,直到我添加了一个编辑框。使用EditBox,出现黑色文字的地方被玻璃取代。这个问题与ComboBoxEx等更高级的控件不同。那些开始看起来像一团糟。

明亮侧这种方法是,alpha混合图像看起来正常的。并逐渐融入玻璃。

该溶液为编辑框好像是用与WS_EX_LAYERED和LWA_COLORKEY使用一些可怕彩色玻璃掩蔽,和擦除的背景彩色。不幸的是这打破了其他的事情图标上的阿尔法混合看起来超级丑陋,阴影与放射性绿色混合,并且玻璃本身变成可点击的,即使窗口上没有WS_EX_TRANSPARENT样式。

第三个建议是用GDI +自定义组合,但这似乎是一个不好的方法,因为GDI +是一个软件后备,我找不到如何将EditBox或ComboBoxEx渲染为图像的方式稍后可以用于构图。

我错过了什么吗?

在于是也就来源似乎面临着同样的问题: link1 link2

+0

您链接的两个问题似乎与您在此询问的内容几乎完全相同。你的问题是什么:任何人有任何其他想法? – 2010-12-06 15:00:27

+0

这些问题描述了RGB(0,0,0)行为的一部分,这似乎被破坏了。我还尝试了通过WinAPI机制进行掩蔽,这些机制仍然不起作用,并导致完全不同但同样错误的结果。所以我仍然想知道是否有人找到了解决方案。 – Coder 2010-12-06 15:07:26

+0

GDI是24bpp是核心问题,玻璃效果需要设置alpha。狮子座的链接看起来不错。 – 2010-12-06 16:00:04

简单的答案是,你不能做到这一点。

所有标准控件呈现自己与正常的GDI调用。普通的GDI呼叫是不知道阿尔法的,并且通常将阿尔法通道设置为零。

更复杂的答案是,你可以:有在网络上的一些样品,其中标准控制与Aero玻璃混合。它们分为两个基本类别:

  • WinForms(.NET)示例。 WinForms实际上并不使用本机控件 - WinForms控件是所有重写的版本,除了其他功能外,使用alpha知道的例程blit。这example是令人沮丧的简单,让我意识到微软讨厌本土开发者。

  • 分类样本:获取常规/本机控件在航空玻璃上绘制的唯一方法是对控件进行子类化,捕获WM_PAINT消息以创建DIBBitmap,调用WM_PRINT将控件内容呈现给它。使用DWM函数修复Alpha通道数据。使用AlphaBlend自己绘制生成的alpha'd bitap。

This article on CodeProject包含子类的大部分标准控件的相当不错的参考实现。

尝试像编辑框的东西“几乎是黑色的”控制更改文本/前景色(如#010101)。那么你应该可以跳过除图像/图标的alpha透明度之外的其他渲染问题。

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

+1

**这是行不通的。**“几乎黑色”只会呈现为“几乎是玻璃”。 “经典应用程序”是什么意思?显然,他正在尝试开发一款适用于Aero UI的应用程序。在你宣称它是“经典”之前,他甚至不能把它赶出门外? – 2010-12-06 14:56:45

肯尼克尔使用编辑控件作为一个例子玻璃上显示控件,写了一篇很好的文章:

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