【问题标题】:C# : Remove Paint Event from PictureBoxC#:从 PictureBox 中删除 Paint 事件
【发布时间】:2015-04-23 18:39:28
【问题描述】:

对不起,我的英语不好。

我有一个图片框,可以在其中绘制 100000 个形状(但可能还有更多)。 绘图是在图片框的 Paint Handler 中进行的。

问题是:当我调整表单的大小(图片框所在的位置)时,使用包含它的面板的滚动条,来自另一个应用程序,......调用绘图处理程序...... 但是绘制过程需要相当长的时间,用户必须等到绘制完成...

我尝试了以下方法:

  • 创建一个我绘制形状的位图
  • 在绘图处理程序中,我将位图复制到图片框中

注意:图片框的大小和内容可以改变,因此位图也必须改变。 位图的创建+位图的恢复使应用程序比以前慢:

Bitmap bmp = new Bitmap(picturebox.Width, picturebox.Height);
// draw in Graphics.FromImage(bmp);
picturebox.Invalidate();
bmp.Dispose();

我还尝试了一个布尔标志:canRedraw。 当图片框的内容发生变化时,我将其设置为真,然后我调用图片框.Invalidate()。在绘图处理程序中,我检查是否 (canRedraw),如果是,我重绘内容(并且 canRedraw = false),否则我什么也不做。 但是通过最后一个解决方案,当我使用表单制作东西时,我的图片框被清除了......

你知道我该怎么做吗:

如果你是改变图片框内容的方法,那么你可以重绘图片框,否则你留下图片框的视觉内容不变

你能帮帮我吗?

非常感谢:)

【问题讨论】:

  • 程序员往往能够编写出能够让当今最强大的处理器崩溃的代码。 十万 个形状肯定会做到这一点。您必须编写更智能的代码,例如利用用户甚至看不到 90% 的形状,因为它们是重叠的这一事实。或者将调整大小的工作传递给 BackgroundWorker,它可以在不影响 UI 响应性的情况下重新生成位图。

标签: c# winforms events paint picturebox


【解决方案1】:

如果您没有使用 PictureBox 的任何其他功能,请尝试将其替换为您自己的 UserControl。然后在您的 UserControl 中执行以下步骤:

  1. 将控件的DoubleBuffered属性设置为True
  2. 始终检查e.ClipRectangle 属性以获取需要重绘的区域。然后遍历你的形状集合,对于每个形状,试着弄清楚它是否与ClipRectangle相交。我不知道你有什么样的形状,但大多数形状都有相当快的实现,包括多边形,可以检查两个多边形是否相交。 this article 中有一篇关于多边形交集的好文章,包括 c# 代码。 (请注意,如果您的形状是矩形、圆形或三角形,则相交问题的计算会变得更容易和更快)
  3. 仅当与ClipRectangle 相交时才绘制形状。

【讨论】:

    【解决方案2】:

    除了将Paint 简化为dotNet 建议的另一种方法外,您尝试过的方法几乎就是您尝试过的方法,但是您需要正确操作:

    是的,Paint事件中绘制Bitmap,但,这将被不必要地调用,然后仍然需要太多时间!而是在您知道您的数据已更改并需要重新绘制时才绘制!

    你没有告诉我们你画了什么,但画应该是这样的:

    void drawStuff()
    {
        Bitmap bmp = new Bitmap(pictureBox.ClientSize.Width, pictureBox.ClientSize.Height);
        using (Graphics G = Graphics.FromImage(bmp) )
        {
            // do all your drawing stuff here!!
    
        }
        pictureBox.Image = bmp;
    }
    

    当你想再次绘制数据时调用这个函数!

    现在您可以将Paint 事件留空,如果系统缓冲了Image,您仍然可以使用PictureBox.ZoomImage.Save..

    【讨论】:

      猜你喜欢
      • 2015-04-22
      • 2016-12-12
      • 1970-01-01
      • 2021-12-03
      • 2019-05-31
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2020-02-03
      相关资源
      最近更新 更多