我正在尝试为应用程序获取媒体播放器玻璃效果,但我面临着各种障碍。是我,还是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渲染到我能够的图像的方法以后用于作文。
我错过了什么吗?
答案 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透明度之外的其他渲染问题。
编辑:绘制其他东西 - 可能是处理兼容性的一些奇怪的方法,但是再次经典的应用程序默认不是玻璃主题...不知道。如果可能的话,尽量避免自己画画。