窗口区域与分层窗口

时间:2018-01-25 17:30:09

标签: windows winapi layered-windows

我希望为应用程序窗口创建自定义圆形框架(边框半径和阴影) 从性能的角度来看,最好的技术是什么?

一个。使用区域(SetWindowRgn)作为圆形应用程序窗口,使用分层窗口(UpdateLayeredWindow)作为阴影。

湾对圆形应用程序窗口和阴影使用分层窗口。

UpdateLayeredWindow的docs指定:

  

通过分层窗口和任何底层窗口获得最佳绘图性能   窗口,分层窗口应尽可能小。

我特意问这个应用程序主窗口,所以一个大窗口可以具有高复杂性,并且大部分时间都在屏幕上可见。

我应该使用应用程序窗口的区域或分层窗口吗?哪一个在CPU /内存上更轻?

1 个答案:

答案 0 :(得分:2)

SetWindowRgn禁用给定窗口的DWM。 DWM是负责使用可用图形硬件以高效方式绘制Window框架的组件。这应该排除SetWindowRgn。此外,SetWindowRgn产生非常“古老”的结果,因为无法进行抗锯齿处理。像素可以是完全透明的,也可以是完全不透明的。

  

通过分层窗口和任何底层窗口获得最佳绘图性能   窗口,分层窗口应尽可能小。

我相信在2018年,这种暗示不那么重要。该文档是在18年前编写的,当时硬件比现在更加有限。

尽管如此,UpdateLayeredWindow并不是绘制自定义窗口框架的最快方法,尤其是当您必须经常更新位图时(例如在窗口调整大小期间)。瓶颈在于这些更新必须从系统内存转移到图形内存。要最小化窗口大小,请创建四个小窗口,这些窗口仅足以绘制窗口的边框/角落。例如,Visual Studio会提取此技巧。使用Spy ++可以看到4个“VisualStudioGlowWindow”实例,这些实例是9像素宽/高(在我的系统上)的分层窗口:

enter image description here

如果您希望获得最佳效果,您还可以查看Direct Composition,并结合WS_EX_NOREDIRECTIONBITMAP extended window style,如文章“High-Performance Window Layering Using the Windows Composition Engine”中所述。这种技术至少需要Windows 8。