2017-10-11 5 views
-1

System.Drawing.Graphicsを使用してC#Windowsフォームで長方形を描画しようとしていますが、ボタンのクリックイベントを使用しないと動作しないようです。オンライン検索フォームロード時にSystem.Drawing.Graphicsを使ってペイントする

は、私はしかし、私の試みは失敗に終わった、フォーム自体の中にペイントまたは示されたイベントのいずれかを使用する必要があることを明らかにしました。

私は、フォームとそのコンポーネントのロード時に私の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

あなたの 'g'と' p'を '.Dispose()'することを忘れないでください。そうしないと、アプリケーションがクラッシュしてしまいます。 – Enigmativity

+0

@Ivan Spajicは、私の答えに編集を検討します。 – 4D1C70

答えて

1

これは、フォームの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); 
     } 
    } 
} 

編集:また、Form1のLoadイベントの下に、あなたの関数を置く問題ないはずですが、リソースに

+2

ディスポーザブルの処分方法を正しく示してください。 – Enigmativity

+0

あなたはおそらく、あなただけの塗装どんなオーバー引いてもよい 'base.OnPaint代わりに、最後の最初の(E)'、または他のフォームを呼び出すことになるでしょう。 –

+0

は、しかし、これは残念ながら私のためにそれをしなかった、あなたの貢献をいただき、ありがとうございます。私は非常に似た質問で答えを見つけたので、私はこの質問を重複としてマークしました。それぞれのオブジェクトを処分しなければならないということは、まだ正しいです。 –

0

を配置するためusingの文を追加しました。

これを試してみてください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()メソッドを呼び出すと何も起こりません。 –

関連する問題