繁体   English   中英

按钮单击Windows窗体C#

[英]button click windows form c#

嗨,大家好,我正在尝试制作一个具有三个按钮(矩形,圆形和直线形)的“ minipaint”应用程序。 我在使buttons正常工作时遇到问题。 例如,我有这个矩形类,它从形状继承了颜色,厚度,起点x,y:

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 我应该如何做这项工作?

您需要全局声明您的Graphics对象:

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));
    }
}

这种方法将缓存与所有需要绘制的对象一起使用。 在按钮上单击,将对象添加到缓存。

您只能在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();
}

更新:上面的答案是假设您在基类shape具有Draw(Graphics g)方法,并且该方法在rectangle类中被覆盖/实现。

您应该在矩形_btn_click内或在任何方法范围之外的类级别声明图形变量'g'。 然后在存根中使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM