加载表单后绘制

时间:2013-12-30 13:03:29

标签: c# drawing transfer

从一周开始学习/使用System.Drawing。这对我来说可以。现在我想将数据从表单1 传输到我的第二表单,并希望在加载表单2后在我的表单2 上绘制2个矩形。我该怎么做?

到目前为止我尝试了什么:

  • 调用表单2_Load

  • onPaint()< - cant transfer Data

  • 事件显示(表单事件) ...

(以下代码仅在我加载表格2后按下第二张表格上的按钮时才有效。)

这部分的代码如何:

表单1:

private void btnGo_Click(object sender, EventArgs e)
    {
        List<string> _basen = new List<string>(); //Add some stuff
        _basen.Add("400;200;45");
        _basen.Add("400;200;45");
        Feld f = new Feld();
        this.Hide();  
        f.transferGameBase(_basen);
        f.ShowDialog();
    }

表格2:

public void transferGameBase(List<string> infoBase)
    {
        int count = 0;

        foreach(string _base in infoBase)
        {
            string[] _splitter = infoBase[count].ToString().Split(';');
            drawBase(Convert.ToInt16(_splitter[0]), Convert.ToInt16(_splitter[1]), Convert.ToInt16(_splitter[2])); //[0] = x , [1] = y, [2] = size
            count++;
        }

    }

    private void drawBase(int x, int y, int size)
    {
            Graphics g = CreateGraphics();
            g.FillRectangle(new SolidBrush(Color.Red), x, y, size, size);

    }

感谢您的回答=)!

2 个答案:

答案 0 :(得分:1)

试试这个:

public void transferGameBase(List<string> infoBase)
    {
        int count = 0;

        foreach(string _base in infoBase)
        {
            string[] _splitter = infoBase[count].ToString().Split(';');
            drawBase(Convert.ToInt16(_splitter[0]), Convert.ToInt16(_splitter[1]), Convert.ToInt16(_splitter[2])); //[0] = x , [1] = y, [2] = size
            count++;
        }

        this.Invalidate();

    }

基本上,窗口只在实际需要时重绘表单,因此当您手动在其上绘制内容时,需要告诉表单重绘自己。

答案 1 :(得分:0)

你甚至可以强制使用你的图形 InvokePaint方法

 private void drawBase(int x, int y, int size)
    {
            Graphics g = CreateGraphics();
            g.FillRectangle(new SolidBrush(Color.Red), x, y, size, size);
            this.InvokePaint(this, new PaintEventArgs(g, this.Bounds));

    }

但由于图形是在显示对象之前创建的,因此仍然无法执行任何操作,并且不是您想要的。

您应该将矩形添加到表单上的变量并处理Paint事件中的变量。