按钮单击Windows窗体c#

本文关键字:窗体 Windows 单击 按钮 | 更新日期: 2023-09-27 18:16:57

嗨,伙计们,我试图使一个"minipaint"应用程序有三个按钮(矩形,圆和线)。我在使我的buttons工作方面有问题。例如,我有一个矩形类它继承了shape:

的颜色,厚度,起始点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。我该怎么做呢?

按钮单击Windows窗体c#

你需要全局声明你的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事件处理程序中的图形对象

实现这种方式可能是棘手的,但无论何时你的面板被重绘,你绘制的形状将消失,如果你不执行绘画在油漆事件。

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类中被覆盖/实现。

你应该在rectangle_btn_click内部声明你的图形变量'g',或者在任何方法作用域之外的类级别声明。然后在存根内使用。