[英]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_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事件處理程序中的圖形對象。
實施此方法可能很棘手,但是只要不在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.