调整窗口大小会导致黑条

我有一个窗体,它在构造函数中设置这些样式:

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.ResizeRedraw, true); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

我在Paint事件中绘制了一些矩形。 表单上没有控件。 Hovewer,当我调整表格的大小时,表格的右下方有黑条。 有什么办法摆脱他们? 我已经尝试了一切,在WndProc监听WM_ERASEBKGND ,手动绘制WM_PAINT上的窗体,实现自定义双缓冲区等。还有什么我可以尝试?

我发现这个: https : //connect.microsoft.com/VisualStudio/feedback/details/522441/custom-resizing-of-system-windows-window-flickers ,它看起来像是DWM中的错误,但我只是希望我能做一些解决方法。

请注意,我必须使用双缓冲,因为我想在Paint事件中绘制相当强烈的graphics表示。 我在C#.NET 2.0,Win7中开发。

状态更新1

我设法通过自己实现resizefunction来摆脱大部分黑色条纹。 Hovewer还有一些小毛病。 有没有办法一次resizepaint操作? 这里是我需要做的一个伪代码

 IntPtr hDC; var size = new Size(250, 200); IntPtr handle = API.PaintAndResizeBegin(this.Handle /* Form.Handle */, size.Width, size.Height, out hDC); using (var g = Graphics.FromHdc(hDC)) { this.backBuffer.Render(g, size); } API.PaintAndResizeCommit(handle); 

有什么办法来实现上面的代码?

第二种解决scheme可以是对整个表单进行后台caching,包括非客户区域。 但是怎么做呢? 我不想自己绘制非客户区域,因为我想保持Vista / 7的良好的空气效果。 任何帮助将深表谢意。

状态更新2

看起来这个问题是无法解决的,因为它在Windows上是无处不在的,在每个应用程序中。 我们只希望MS能够在Mac OS X中获得一些灵感,并将在新的Windows中提供适当的API。

Solutions Collecting From Web of "调整窗口大小会导致黑条"

我找到了可以同时绘制和调整窗口大小的函数 – UpdateLayeredWindow

所以现在应该可以创建可调整大小的窗口,在调整大小的时候没有任何条带。 但是,您需要自己绘制窗口内容,所以有点不方便。 但我认为使用WPFUpdateLayeredWindow ,应该没有任何问题。


更新

发现问题。 :-)使用UpdateLayeredWindow ,必须自己绘制窗口的边框。 所以,如果你想在win7中使用具有良好的玻璃效果的UpdateLayeredWindow绘制标准的窗口,你是拧。

Microsft Connect甚至是一个关于这个问题的线索,微软说这是一个设计缺陷,如果它得到解决,那么可能在Win8或更新的系统中。 所以我们不能做这个。

我发现最好不要直接在Form表面上做任何自定义的渲染。 相反,在窗体上放置停靠的PictureBox,创建将显示在PictureBox中的Bitmap对象,使用System.Drawing.Graphics.FromImage(Image)方法将所有内容绘制到该对象上。

我用一个游戏循环的方法来制作一个简单的射击游戏(Crimsonland风格),并获得了相当不错的性能(抗锯齿线),高于100 FPS。