按钮单击Windows窗体c#
本文关键字:窗体 Windows 单击 按钮 | 更新日期: 2023-09-27 18:16:57
嗨,伙计们,我试图使一个"minipaint"应用程序有三个按钮(矩形,圆和线)。我在使我的buttons
工作方面有问题。例如,我有一个矩形类它继承了shape:
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_Paint
和rectangle_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',或者在任何方法作用域之外的类级别声明。然后在存根内使用。