2016-12-27 82 views
0

所以我创建了一个自定义控件,我想绘制该控件 现在的问题是,我不能使用OnPaint事件,因为我想 在不同的时间绘制不同的条件。C#绘制自定义控件

这里是自定义的控制功能来绘制一个矩形

public void DrawARectangle(int x,int y,int height,int width) 
 
{ 
 
    Graphics g = this.CreateGraphics(); 
 
    g.DrawRectangle(Pens.Black, x, y, height, width); 
 
    g.FillRectangle(Brushes.Black, x, y, height, width); 
 
}

我基本上把它从我的形式,但它即使使用更新后不画任何东西()方法。

回答

1

Graphics g = this.CreateGraphics();这几乎总是错了。使用Paint/OnPaint事件及其e.Graphics参数!在一些地方保存的坐标,并准备总是画寄托都..

,因为我想在不同条件下不同的时间画出我不能使用OnPaint事件。是的。但你必须

这是图形在winforms中的工作方式。这只听起来浪费,但..:该系统还需要调用此事件时,必须要恢复的窗口,所以没有办法解决它,如果你希望你的绘图到坚持 ..

只有非 - 持续图形操作(如显示动态橡皮筋矩形或跟在鼠标后面的一行)与您从control.CreateGraphics()获得的Graphics对象正常。和测量没有绘图...

每当您的数据发生变化时,通过在您的控件上调用Invalidate触发重新绘制。

2

您必须使用Control.OnPaint来进行自定义绘图。否则,在下次重新绘制控件后,所有图形都将被删除。 这个想法是你可以将你的矩形存储在一个列表中。然后在您的Control.OnPaint中,根据该列表执行绘图。

+0

以及我试图制作一个像控件一样的地图,它会不断更新,但我猜如果我不能将它作为一个自定义控件,然后在它自己的形式。 – Diab

+0

@Diab,即使你直接在表单中。您还需要在Form.OnPaint事件中执行操作。校长还是一样的。 –

+0

我确实在表单上多次绘制过它,它可以工作,也许你想念我,我想在OnPaint事件发生后绘制,我不明白为什么它必须再次发生或由它自己重绘。 – Diab