簡體   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