WPF自定义绘图和透明度

我有一个自定义窗口样式的WPF应用程序(AllowsTransparency =“True”WindowStyle =“None”)。 此窗口具有自定义峰值计量器控件,该控件使用WriteableBitmap从DirectSound音频输入中绘制数据。

我正在使用绘制为彩色矩形(红色/黄色/绿色/红色)的所有级别的位图,并且当音频到达时,我只在顶部的电平表上绘制一个黑色矩形。 它在我的机器上运行正常(Windows 7,Pentium 4单核)。 但是它在配备Windows XP SP3和集成视频的笔记本电脑上效果不佳。

我知道透明度效果在DirectX 9上有一些问题,但我已经读过这个问题应该在SP3中解决。 仍然对_writeableBitmap.AddDirtyRect的调用在XP上占用30-40%的CPU,有时会导致音频丢失(如果使用USB音频,而这些丢失不在我的应用程序中,而是在DirectSound < - >驱动程序子系统中的某处)。

在Windows 7上,相同的应用程序不会超过3%的CPU,并且没有注意到音频丢失(但在Win7 PC上的CPU实际上比在带有XP的笔记本上更弱)。

我尝试不使用AddDirtyRect,但只需在图像上用leds绘制WPF Rectangle元素,并在新音频级别到达时设置矩形的高度。 真是一个惊喜! 以某种方式改变Rectangle元素的高度需要的资源比为100x20像素矩形调用_writeableBitmap.AddDirtyRect要少得多! 现在在XP上只用了10-20%,而不是用AddDirtyRect的30-40%。

但是当我从窗口中删除透明效果时,最后还是XP(甚至在VirtualBox上)下降到了2-6%的CPU。 显然,透明度使得每秒重绘20x100矩形十次真的很困难。

在我的应用程序中,我的生活可能没有透明度,但问题是 - 设计使用了圆角窗,我需要切断它们周围的区域。 但只要我设置AllowsTransparency =“False”,窗口就会显示背后的背景颜色。

所以主要的问题是 - 如何让窗口的内容去掉窗口的背景,让角落保持圆整,而不使用XP重量的透明度?

我记得,即使在C ++ Windows应用程序中,我也可以通过设置自定义窗口区域而不使用任何透明(即在Windows 98机器上)来实现。 在WPF上可以做同样的事情吗?

或者也许有一些技巧如何让WriteableBitmap在XP上使用更少的资源?


由于我没有找到更好的东西,我使用了旧的方式:SetWindowRgn API。

这有点复杂,因为我的应用程序使用了一些伸出主窗口的动画滑出部分,所以我必须将WPF动画与SetWindowRgn调用同步,以使得滑出效果看起来尽可能干净。 结果并不理想,但可以接受。 主要的是 - 没有更高的CPU和没有音频丢失。

链接地址: http://www.djcxy.com/p/25909.html

上一篇: WPF custom drawing and transparency

下一篇: How to make an OpenGL rendering context with transparent background?