2016-03-02 95 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

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