2016-11-08 146 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