在运行时移动重叠的Picturebox会导致重绘滞后

时间:2013-01-11 15:17:33

标签: c# .net winforms picturebox

我有2个可移动的图片框,允许用户移动图像并按照他们想要的方式对齐

当我将图片框A拖到图片框B上时,A图像的尾部显示为B.它很快就消失了。这与您在非常旧的Windows上看到的分辨率很差的内容相同。

它的特殊之处在于它只显示在静态图片框内,而不是下面的空白区域。我一直在摆弄暂停布局和恢复布局而没有太多运气。有什么建议?如果有帮助的话,我也愿意将控件类型从Picturebox更改为其他内容。

public void OnMouseMove(object sender, MouseEventArgs mouseEventArgs)
    {
        var control = sender as Control;

        control.SuspendLayout();

        Point pt = new Point(mouseEventArgs.X, mouseEventArgs.Y);

        control.Left += pt.X - _startDraggingPoint.X;
        control.Top += pt.Y - _startDraggingPoint.Y;


        control.ResumeLayout();
    }

3 个答案:

答案 0 :(得分:2)

这在Winforms中是一个相当不可避免的问题,它是由于您使用多个控件而引起的,因为控件呈现给屏幕的方式是可见的。逐一。双缓冲不能解决问题,它仅适用于每个单独控件的渲染,PictureBox已经是双缓冲的。实际上,它会使问题更糟,因为双缓冲不是免费的,并且延迟了绘制程序。

它可见的最大原因是因为您的PictureBox控件在绘制图像时速度很慢。当你要求它缩放图像并期望它从一个大图像渲染一个漂亮的小图像时,就会发生这种情况。这种重新缩放需要时间,特别是在图像很大的情况下,并且每次控件自行绘制时都会进行。您可以通过自己预先缩放图像来修复它,这样控件就不必这样做了。

一个真正的解决方法是根本不使用任何PictureBox控件,只需让Form绘制图像即可。现在双缓冲可以解决您的问题。你当然会失去很多便利,包括PB执行的内置扩展和免费获得的命中测试。实际上并不难实现。

Windows中有一个神奇的咒语可以潜在地解决问题,而无需您进行任何改进代码的工作。您可以要求它对窗口及其所有子控件进行双缓冲。一切都被渲染到一个屏幕外缓冲区,结果显示在屏幕上。将此代码粘贴到表单中:

protected override CreateParams CreateParams {
    get {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
        return cp;
    }
}

这个可以导致绘制工件,如果它们太有害,那么你将不得不改进你的代码。

答案 1 :(得分:0)

设置属性" DoubleBuffered"你的控件是真的。这可能有助于减少闪烁。

请参阅:http://msdn.microsoft.com/de-de/library/system.windows.forms.control.doublebuffered(v=vs.80).aspx

答案 2 :(得分:0)

最后,我采用了不同的解决方案。我们使用DevExpress的文档管理器来保存我们的图像控件。它需要一些工作,但效果更好,结果也很顺利。