我有一个表单,它在构造函数中设置这些样式:
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
我在Paint
事件中画了一些矩形。表单上没有控件。但是,当我调整表格大小时,表格的右侧和底部都有黑色条纹。有没有办法摆脱它们?我已经尝试了一切,听WM_ERASEBKGND
in WndProc
,手动绘制表单WM_PAINT
,实现自定义双缓冲区等。还有什么我可以尝试的吗?
我发现了这个: https ://connect.microsoft.com/VisualStudio/feedback/details/522441/custom-resizing-of-system-windows-window-flickers 看起来它是 DWM 中的一个错误,但我只是希望我能做一些解决方法。
请注意,我必须使用双缓冲,因为我想在Paint
活动中绘制非常强烈的图形演示。我在 C# .NET 2.0、Win7 中开发。
状态更新 1
通过自己实现调整大小功能,我设法摆脱了大部分黑色条纹。但是,仍然存在一些小故障。有什么办法可以resize
同时paint
操作吗?这是我需要做的伪代码:
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);
有没有办法实现上面的代码?
第二种解决方案可能是回缓冲整个表单,包括非客户区。但是怎么做呢?我不想自己绘制非客户区域,因为我想在 Vista/7 上保持良好的航空效果。任何帮助将不胜感激。
状态更新 2
看起来这个问题是无法解决的,因为它在 Windows 上无处不在,在每个应用程序中。我们只能希望 MS 在 Mac OS X 中获得一些灵感,并在新的 Windows 中提供适当的 API。