2017-10-11 80 views
-1

我想在C#Windows窗體中使用System.Drawing.Graphics繪製一個矩形,但我似乎無法讓它在沒有使用按鈕單擊事件的情況下工作。繪製與System.Drawing.Graphics窗體上加載

在線搜索發現我必須使用表單內的Paint或Shown事件,但是我的嘗試失敗了。

我想在加載表單及其組件時運行我的Draw()方法。

public Form1() 
{ 
    InitializeComponent(); 
    Draw(); //doesn't work 
} 

private void Draw() 
{ 
    Graphics g = pictureBox.CreateGraphics(); 
    g.Clear(Color.White); 
    Pen p = new Pen(Color.Black, 1); 
    g.DrawRectangle(p, 0, 0, 50, 50); 
} 

private void ApproximateButton_Click(object sender, EventArgs e) 
{ 
    Draw(); //works 
} 

實現此目的的正確方法是什麼?

+0

不要忘了'.dispose()'你的''''''''''否則你會最終崩潰你的應用程序。 – Enigmativity

+0

@Ivan Spajic,考慮我的答案編輯。 – 4D1C70

回答

1

您可以實現此重寫Form的OnLoad事件,也可以重新使用PaintEvent參數。

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    using (Graphics g = e.Graphics) 
    { 
     g.Clear(Color.White); 
     using (Pen p = new Pen(Color.Black, 1)) 
     { 
      g.DrawRectangle(p, 0, 0, 50, 50); 
     } 
    } 
} 

編輯:添加using語句配置資源

+2

您應該正確顯示如何處置一次性用品。 – Enigmativity

+0

您可能會首先調用'base.OnPaint(e)'而不是最後一個,否則該表單可能會畫出您剛剛繪製的任何內容。 –

+0

謝謝你的貢獻,但不幸的是這並不適合我。我在我的一個非常類似的問題中找到了答案,所以我將這個問題標記爲重複。你必須處理相應的對象仍然是正確的。 –

0

你也應該罰款把你的作用下,Form1的Load事件。

訂閱Load事件後,試試這個;

public Form1() 
{ 
    InitializeComponent(); 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Draw(); 
} 

private void Draw() 
{ 
    Graphics g = pictureBox.CreateGraphics(); 
    g.Clear(Color.White); 
    Pen p = new Pen(Color.Black, 1); 
    g.DrawRectangle(p, 0, 0, 50, 50); 
} 

Load事件在構造函數之後被調用。您的表單元素正在構造函數中創建,因此您在嘗試在同一個函數中使用它們時遇到了一些問題。

+0

我試過了,它不適合我。我可以打印確認我正在按事件委託的正確方法,但是在調用我的Draw()方法時,沒有任何反應。 –