【发布时间】:2010-04-10 13:00:59
【问题描述】:
我有一个表单,它在构造函数中设置这些样式:
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
我在Paint 事件中绘制了一些矩形。表单上没有控件。但是,当我调整表单大小时,表单的右侧和底部都有黑色条带。有没有办法摆脱它们?我什么都试过了,在WndProc 中监听WM_ERASEBKGND,在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。
【问题讨论】:
标签: c# .net windows windows-7 flicker