2016-11-08 4 views
0

こんにちは、私は3つのボタン(矩形、円、線)を持つ "ミニペイント"アプリケーションを作ろうとしています。私はbuttonsの作業に問題があります。たとえば、私は形から色を継承し、この矩形クラス、厚さ、startpointsのX、Yを持っている:ボタンクリックウィンドウのフォームC#

class rectangle : shape 
{ 
    public int length { get; set; } 
    public int width { get; set; } 

    public override void Draw(Graphics g) 
    { 
     g.DrawRectangle(new Pen(color), new Rectangle(startx, starty, width, length)); 
    } 
} 

は、今私は、私はそれをクリックしたときに私のrectangle_btn_Clickが私panelで四角形を印刷したいです。ここに私のpanelコードです:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = panel1.CreateGraphics(); 
} 

、これが私のbuttonです:

private void rectangle_btn_Click(object sender, EventArgs e) 
{ 
    rectangle r = new rectangle(); 
    int retval = r.Draw(g); 
} 

しかし、それはエラーがあり、それがgを認識しません。この仕事をどうすればいいですか?

答えて

3

あなたのグラフィックスがグローバルオブジェクトを宣言する必要があります:

private Graphics g; 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    g = panel1.CreateGraphics(); 
} 

その後、これはまた、これはpanel1_Paintrectangle_btn_Click両方とも同じクラスで宣言されているを前提としてい

private void rectangle_btn_Click(object sender, EventArgs e) 
{ 
    rectangle r = new rectangle(); 
    r.Draw(g); 
} 

を動作するはずです。

EDIT:krw12572 @として

は、これに伴う問題は、パネルが再描画されますので、フォームを最小化した後、描画オブジェクトが消えてしまうということであると指摘しました。問題を解決するため、以下の編集がなされる必要があるために:

private List<shape> shapes = new List<shape>(); 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    foreach (var shape in shapes) { 
     shape.Draw(e.Graphics); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    //This will however draw a rectangle at a fixed position with a fixed size   
    rectangle r = new rectangle() {startx = 10, starty = 10, length = 10, width = 10, color = Color.Black}; 
    shapes.Add(r); 
    panel1.Invalidate(); 
} 

また、クラスは次のようなものになります。

public class shape 
{ 
    public Color color { get; set; } 
    public int width { get; set; } 
    public int startx { get; set; } 
    public int starty { get; set; } 

    public virtual void Draw(Graphics g) 
    { 

    } 
} 

public class rectangle : shape 
{ 
    public int length { get; set; } 
    public int width { get; set; } 
    public override void Draw(Graphics g) 
    { 
     g.DrawRectangle(new Pen(color), new Rectangle(startx, starty, width, length)); 
    } 
} 

をこのアプローチでは、描画する必要があるすべてのオブジェクトをキャッシュに使用しています。ボタンをクリックすると、オブジェクトがキャッシュに追加されます。

+1

dispose = badはありません。 – Sinatr

+0

この解決方法は構文エラーを修正し、矩形を描画しますが、 'panel1'を再描画するとその矩形は消えます。私が何を話しているのかを見るために、アプリケーションを最小化し、再度最大化してください(四角形が描かれた後)。 –

+0

@ krw12572あなたの懸念を考慮して私の答えを更新します。私もそれをテストし、最小化して最大化した後でも正しく動作するはずです。 –

0

Graphics変数 'g'をrectangle_btn_clickの中に宣言するか、または任意のメソッドスコープ外のクラスレベルで宣言する必要があります。その後、スタブ内で使用してください。

1

ペイントイベントハンドラでのみペイントを実行する必要があります。ペイントイベントハンドラのグラフィックスオブジェクトを使用します。

この方法を実装するのは難しいかもしれませんが、パネルを再描画するたびに、ペイントイベントでペインティングを実行しないとペイントされたシェイプは消えます。

private shape _shape; 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    _shape.Draw(e.Graphics); 
} 

private void rectangle_btn_Click(object sender, EventArgs e) 
{ 
    _shape = new rectangle(); 
    panel1.Invalidate(); 
} 

更新:答え上記 はあなたのベースクラスshapeDraw(Graphics g)方法を持っていると仮定され、それはrectangleクラスに実装/オーバーライドされています。

+0

_shape.Draw(e.Graphics);行の "mehodグループであるため描画できません" – sara

+0

これは、あなたのDrawメソッドが 'shape'クラスで書かれていないからです。さて、 'private shape _shape;の代わりに' private rectangle _shape; 'を試してください。それはうまくいくはずです。 –

+0

本当に助けてくれてありがとう – sara