繁体   English   中英

C#:从PictureBox删除Paint事件

[英]C# : Remove Paint Event from PictureBox

对不起,我的英语不好。

我有一个画框,可在其中绘制100000个形状(但可能还有更多)。 在图片框的“绘制处理程序”中绘制图形。

问题是:当我调整窗体的大小(图片框所在的位置)时,使用包含该窗体的面板的滚动条(来自另一个应用程序).​​..绘制处理程序被称为...但是绘制过程需要相当长的时间用户必须等到油漆涂完为止。

我尝试了以下方法:

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

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

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

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

您对我如何做到这一点有任何想法:

如果您使用的是更改图片框内容的方法,则可以重新绘制图片框,否则您将图片框的视觉内容保持不变

你能帮助我吗 ?

非常感谢你 :)

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

  1. DoubleBuffered属性设置为True
  2. 始终检查e.ClipRectangle属性以获取需要重绘的区域。 然后遍历您的形状集合,并为每个形状尝试确定我们是否与ClipRectangle相交。 我不知道您使用哪种形状,但是大多数形状(包括多边形)都可以使用非常快速的实现,它可以检查两个多边形是否相交。 关于多边形交集一篇好文章,请在本文中 ,包括C#代码。 (请注意,如果您的形状是矩形,圆形或三角形,则相交问题的计算变得更加容易和快捷)
  3. 仅当形状与ClipRectangle相交时才绘制形状。

除了将Paint简化为dotNet建议以外,另一种方法是尝试做的,但是您需要正确地做:

是的, 确实要绘制一个Bitmap不要在“ Paint事件中Paint ,这将被不必要地调用,但是仍然花费太多时间! 相反, 当您知道数据已更改并且需要重绘时才绘制!

您并没有告诉我们您所绘制的内容,但是绘制应该像这样进行:

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 .。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM