Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 使用分层窗口创建平滑的窗口边框_Windows_Winapi_Alpha_Layered - Fatal编程技术网

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

Windows 使用分层窗口创建平滑的窗口边框,windows,winapi,alpha,layered,Windows,Winapi,Alpha,Layered,我们正在开发一款有皮肤的应用程序,它的大部分窗口都有各种圆形边缘。我使用窗口区域来定义非矩形形状,但几乎每个对象都会产生锯齿状的锯齿状别名,因为像素只能是完全不透明或完全透明的 我已经提出了一个使用分层窗口的解决方案,但我们希望确保它能在各种系统上运行(并希望运行良好),我想看看是否有人有更好的想法或方法来优化我正在做的事情。我知道分层windows需要win2000或更高版本,这很好,因为这已经是出于其他原因的要求。从一些基本测试来看,它在Vista上看起来不错,但这还不能保证 我就是这么做的

我们正在开发一款有皮肤的应用程序,它的大部分窗口都有各种圆形边缘。我使用窗口区域来定义非矩形形状,但几乎每个对象都会产生锯齿状的锯齿状别名,因为像素只能是完全不透明或完全透明的

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

我就是这么做的:我有一个窗口,称之为a,带有控件和文本,以及构成该窗口的任何东西。我将窗口B作为窗口a的子窗口,除了它具有WS_弹出样式而不是WS_子窗口之外,因此它可以将自身定位在a的区域之外,并绘制在a的控件之上。窗口B也有WS_EX_分层样式,在初始化时,我使用ULW_ALPHA标志和一个带有ALPHA通道的32位位图的源DC进行调用,以便使用每像素ALPHA进行绘制

窗口B的源DC中使用的位图几乎就是窗口边界周围的像素,我想从窗口的背景平滑地混合到完全透明。我会跳过整个两个窗口的方法,只使用一个单层窗口,除了当您使用UpdateLayeredWindow时,它是从内存中保存的缓冲区中提取的,而不是典型的WM_PAINT消息和所有这些,并且尝试让交互式子控件(和子窗口)很好地处理这听起来像是一件非常麻烦的事情(甚至可能不会对所有的事情都起作用)

所以,它基本上是一个有所有子控件的窗口A,窗口B直接浮在它上面,画了一个平滑的边框。我通过移动窗口B来响应WM_移动消息等等,我禁用了窗口B,所以它永远无法获得焦点或输入(由于其不透明度为零的部分(例如其大部分内部部分)已被排除在拾取之外,因此单击已通过)

对于踢腿,下面是这些棋子的样子,以更好地展示我的意思

  • ,青色用于遮罩完全透明的像素
  • ,带有一个alpha通道(当然没有图片,它是jpg),可以将非黑色像素混合到透明度中
所以,这是可行的,但我不能确定这是否是最好的方法。我有两个问题:

  • 这听起来可以接受吗,还是有什么可怕的地方
  • 就目前的工作情况而言,它似乎使用了一个窗口大小的屏幕外缓冲区(最大可达1024x768),即使其中很少有像素具有非零不透明度数据——是否值得将其分割为单独的边框并将其合成在一起的开销和额外复杂性

我发现了一件事:拥有单独的框架块比拥有一个巨大的框架窗口要快得多,中间有大量的空像素。我没有任何实际的数字,但是仅仅从快速尝试两个方面来看,当有多个框架窗口覆盖的窗口时,有一个明显的延迟。它们之间相互映射,但当它们的帧被切割成更小的组件时,就更快捷了。拥有具有自己设备上下文的多层窗口的开销不会带来太大的影响,而拥有大面积的像素(空白或非空白!)仍然会带来更大的负载

  • 别忘了在RDP和VM(Hyper-V和VMWare)下进行测试
  • 在上网本和笔记本电脑上尝试几张gfx卡(如果适用)

  • 我的产品使用分层窗口来绘制我附加到每个窗口的小选项卡。我使用分层窗口来获得平滑的舍入,而不产生锯齿。到目前为止,我遇到的唯一令人讨厌的问题是,在没有DWM的windows XP和Vista上,一些OpenGL窗口在分层窗口的顶部乱涂乱画。这是一个低级问题,Microsoft尚未解决非常有用。打开Google Earth并将应用程序拖动到主渲染窗口上,即可复制该应用程序。分层窗口将消失。

    这应该没问题;该应用程序基本上是一个更大的全屏DirectX应用程序的启动程序,因此不太可能运行另一个3D/图形密集型程序Concure不过,谢谢你的警告!道格,如果你能分享这方面的代码就太好了。提前谢谢。