2016-03-02 58 views
0

我玩了一些由我创建的自定义控件,我想为它们绘制一些图形。创建新对象时绘制图形

我实现了我想要的一切,但我有一个问题,因为有些东西对我来说似乎很陌生。 我试图例如使一个新的控制是这样的:

public class Square : Control 
{ 
    public Square(Point location) 
    { 
     this.Size = new Size(100, 100); 
     this.Location = location; 
     Draw(); 
    } 

    public void Draw() 
    { 
     Graphics g = this.CreateGraphics(); 
     g.DrawRectangle(Pens.Black, 5, 5, 20, 20); 
    } 
} 

这不画任何东西,但是,如果我叫“绘制”的方法从喜欢它的工作表单上的按钮按下另一个动作。 如果我重写我的控件的OnPaint方法并在这里调用“Draw”方法,它也可以工作。 (我知道我应该制作Paint/OnPaint中的所有绘图,但我只是为了尝试其他的东西)

有什么区别?为什么我不能在我想要的任何位置调用我的“绘制”方法?

+0

大概由'Draw()'调用完成的绘图被第一个'OnPaint'调用覆盖。并且在一个按钮点击处理程序中调用它只会“工作”,直到部分或全部控件失效并调用“OnPaint”,这将再次覆盖您在“Draw”中绘制的内容。这是仅在“OnPaint”中绘制规则的原因。请参阅http://stackoverflow.com/questions/30419493/d​​rawing-glitches-when-using-creategraphics-rather-than-paint-event-handler-for-c。 – adv12

+0

你可以简单地关注[msdn](https://msdn.microsoft.com/en-us/library/b818z6z6(v = vs.110).aspx)(quote:*“当从Control类继承时,你必须重写'OnPaint'方法“*)。谁告诉你你的方法应该起作用?它不会。 – Sinatr

+0

现在我明白了!真棒解释:) –

回答

1

当您在构造函数中调用Draw()方法时,控件尚未添加到父项中,只是内存中的一个对象,因此调用不起作用。

如果按照OnPaint()方法中的说法进行呼叫,则会绘制该方法,因为无论何时需要渲染控件时都会调用此方法。

+0

感谢您的答案!我知道了。 –