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

标签 windows winapi alpha layered

我们正在开发一款带皮肤的应用程序,其大部分窗口都有各种圆边。我正在使用窗口区域来定义非矩形形状,但几乎每个人都反对由此导致的锯齿状锯齿,因为像素只能完全不透明或完全透明。

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

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

在窗口 B 的源 DC 中使用的位图几乎只是窗口边界周围的像素,我想从窗口的背景平滑地混合到完全透明。我会跳过整个两个窗口的方法,只使用一个分层窗口,除了当你使用 UpdateLayeredWindow 时,它是从保存在内存中的缓冲区中绘制的,代替典型的 WM_PAINT 消息和所有这些,并试图获得交互式子控件(和子窗口)与这听起来很麻烦(甚至可能不适用于所有情况)。

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

踢球,这是这些作品的样子,以更好地表达我的意思。

所以,它有效,但我不能确定它真的是最好的方法。我有两个问题:

  • 这听起来是否可以接受,或者它有什么明显可怕的地方吗?
  • 由于它目前的工作原理,它似乎正在使用窗口大小的屏幕外缓冲区(最大可达 1024x768),即使它的极少数像素具有任何非零不透明度数据——它会是将其切割成单独的边界 block 并将它们组合在一起的开销和额外的复杂性是否值得?

最佳答案

我发现了一件事:拥有单独的帧片段比拥有一个巨大的帧窗口(中间有一大片空白像素)渲染速度要快得多。我没有任何实际数字,但只是通过对两者的快速测试,当几个具有全帧窗口的窗口相互重叠时会有明显的延迟,但是当它们的帧被切割成更小的组件时,它会更加快速.拥有具有自己的设备上下文的多层窗口的任何开销都不会产生太大影响,并且具有大面积像素(空白或不空白!)仍然会产生更多负载。

关于windows - 使用分层窗口创建平滑的窗口边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/745404/

相关文章:

windows - 离线安装socket.io

mysql - Django:无法连接到 mysql

c - 使用 PrintWindow 渲染 chrome

c# - Process.GetProcessById 启用 "debug mode"

c# - 在 C# 中显示带有 alpha channel 的 PNG

windows - 什么是防护区域以及它与关键区域有何不同?

windows - WScript echo 在 UFT 中不起作用

javascript - three.js - 如何渲染带有 alpha channel 的线条?

winapi - 在Windows 7中模拟PC Speaker?

delphi - delphi TBitmap是否支持alpha channel