我正在尝试为应用程序获得媒体播放器玻璃效果,但我面临着各种障碍。是我,还是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 渲染为可用于合成的图像的方法之后。
我错过了什么吗?