2016-11-08 149 views
0

嗨,大家好我想製作一個具有三個按鈕(矩形,圓形和線)的「minipaint」應用程序。我在製作我的buttons時遇到問題。例如,我有這個矩形類繼承顏色,厚度,startpoints X,Y從形狀:按鈕點擊Windows窗體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(); 
} 

那麼這也應該工作

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

這是假設panel1_Paintrectangle_btn_Click都在同一個類都聲明。

編輯:

正如@ 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

不處理=壞。 – Sinatr

+0

此解決方案將修復語法錯誤並繪製矩形,但當重繪時,該矩形將消失。嘗試最小化並再次最大化應用程序(繪製矩形後)以查看我在說什麼。 –

+0

@ krw12572考慮到您的顧慮,我會更新我的答案。我也對它進行了測試,即使在最小化和再次最大化之後,它也應該正常工作。 –

0

您應該在rectangle_btn_click中聲明Graphics變量'g',或者在任何方法範圍外聲明您的Graphics變量'g'或類級別。然後在你的存根中使用它。

1

您應該只在Paint事件處理程序中執行任何繪畫。使用Paint事件處理程序中的圖形對象。

以這種方式實現可能會非常棘手,但是無論何時重繪面板,如果您不在Paint事件中執行繪畫,則繪製的形狀將消失。

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

它具有「不能分配給Draw,因爲它是一個mehod組」錯誤_shape.Draw(e.Graphics)行; – sara

+0

這是因爲你的Draw方法不是寫在'shape'類中的。現在,不是'私人形狀_shape;'嘗試'私人矩形_shape;'。這應該工作。 –

+0

謝謝,這真的很有幫助 – sara