![](/img/trans.png)
[英]call Paint event of picturebox from PageLoad in C# causes an error
[英]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中执行以下步骤:
DoubleBuffered
属性设置为True
。 e.ClipRectangle
属性以获取需要重绘的区域。 然后遍历您的形状集合,并为每个形状尝试确定我们是否与ClipRectangle
相交。 我不知道您使用哪种形状,但是大多数形状(包括多边形)都可以使用非常快速的实现,它可以检查两个多边形是否相交。 关于多边形交集一篇好文章,请在本文中 ,包括C#代码。 (请注意,如果您的形状是矩形,圆形或三角形,则相交问题的计算变得更加容易和快捷) 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.Zoom
或Image.Save
.。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.