使用分层窗口创建平滑的窗口边框

Dou*_*dek 9 windows winapi alpha layered

我们正在开发一款带有各种圆形边缘的皮肤应用程序.我使用窗口区域来定义非矩形形状,但几乎每个人都对象造成锯齿状混叠,因为像素只能是完全不透明或完全透明.

我已经使用分层窗口提出了一个解决方案,但我们希望确保在各种系统上运行(并希望运行良好),我想看看是否有人有更好的想法或方法优化我正在做的事情.我知道分层窗口需要win2000或更高版本,这很好,因为这已经是其他原因的要求.从一些基本测试看起来它在Vista上看起来不错,但这还不能保证.

这就是我所做的:我有一个窗口,称之为A,带有控件和文本以及包含该窗口的任何内容.我有窗口B作为窗口A的子窗口,除了它具有WS_POPUP样式而不是WS_CHILD,因此它可以将自己定位在A的区域之外并绘制在A的控件之上.窗口B也具有WS_EX_LAYERED样式,并且在初始化时,我使用ULW_ALPHA标志调用UpdateLayeredWindow,使用带有alpha通道的32位位图调用源DC,以使其以每像素alpha绘制.

窗口B的源DC中使用的位图几乎就是窗口边框周围的像素,我希望从窗口的背景平滑地混合到完全透明.我会跳过整个两个窗口的方法,只使用单个分层窗口,除了当你使用UpdateLayeredWindow时,它是从保存在内存中的缓冲区中提取的,代替典型的WM_PAINT消息和所有这些,并试图获取交互式儿童控制(和儿童窗口)能够很好地发挥作用,听起来非常麻烦(甚至可能不适用于所有事情).

因此,它基本上是窗口A,包含所有子控件等等,窗口B直接浮在它上面,绘制一个漂亮的光滑边框.我通过移动窗口B来响应WM_MOVE消息等等,并且我禁用了窗口B,因此它永远不会获得焦点或输入(点击已经通过,因为它的部分是不透明的,例如大多数它的内部部分已被排除在采摘之外).

对于踢球,这里的部分是什么样的,以显示我的意思更好一点.

所以,它有效,但我无法确定它是否真的是最好的方法.我有两个问题:

  • 这听起来是否可以接受,或者它有什么明显的可怕之处?
  • 正如它目前的工作原理,似乎它使用了窗口大小的离屏缓冲区(可以达到1024x768),即使它的极少数像素具有任何非零不透明度数据 - 它是否值得开销以及将它们切割成单独的边框并将它们合成在一起的额外复杂性?

Mau*_*gan 2

我的产品使用分层窗口来绘制附加到每个窗口的小选项卡。我使用分层窗口来获得平滑的舍入而不会出现锯齿。到目前为止,我遇到的唯一令人讨厌的问题是,在没有 DWM 的 Windows XP 和 Vista 上,一些 OpenGL 窗口会在分层窗口之上乱写乱画。这是一个低级问题,微软并没有提供太多帮助。您可以通过打开 Google Earth 并将应用程序拖动到主渲染窗口上来重现它,您的分层窗口将会消失。