我需要在屏幕上800x800像素的正方形中的100个半随机点之间绘制100条线。
我一直在使用内置的绘图线和在.NET内部绘制drawrecangles函数,但每次表单绘制时我的绘图都会被删除。
所以,我一直在考虑绘制内存中的位图,但我不确定这是否是一个很好的解决方案。
任何提示?
答案 0 :(得分:3)
这不仅是个好主意,而且还有一个名字(双缓冲)。在表单级别的Bitmap上绘制,然后在表单的Paint事件中(实际上最好使用表单上的PictureBox,并使用它的Paint事件)使用Graphics对象的DrawImage方法绘制你的位图到PictureBox。
更简单的方法是创建Bitmap,在其上绘制,然后将Bitmap设置为PictureBox的Image属性。即使您的表单重新绘制,这也会自动保留图像。
答案 1 :(得分:3)
假设我的机器的GDI +性能可比,那不是一个好主意。 Form类已经通过DoubleBuffered属性支持双缓冲。假设你不像它那样深入P / Invoke,那么它比你能做的更好。
我的测量结果:
当你绘制超过400行时,这当然会改变。为了获得WF的双缓冲给你的性能,你必须使用BufferedGraphics类。这是非常不友好的。
答案 2 :(得分:2)
这是一个好主意。您绘制到位图,并在您的表单中绘制位图。只需在修改位图后调用重绘(或等效)。
答案 3 :(得分:1)
您可以在位图上绘制以使其持久化,或者您可以使用绘制事件在表单上绘制它。
要绘制位图(在此示例中为图片框Picture1):
dim g as graphics
g = Graphics.FromImage(Picture1.Image)
g.DrawRectangle(...)
使用绘画事件:
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
e.Graphics.DrawRectangle(...)
end sub
答案 4 :(得分:0)
虽然BufferedGraphics可能不友好,this guy explains it well使用基类,您可以将其用于自己的控件。