从文本中读取以绘制点

时间:2014-11-25 13:35:13

标签: c# forms graphics streamreader

问候! 我想从一个看起来像这样的文本中读到:

1111.49 2822.06 Aba
1235.94 2848.48 Abadszalok
1087.09 2768.63 Abaliget

第一个数字是x,第二个数字是y。在带有按钮的表单上,它会读取文件并将它们变成这样的点:

private void button1_Click(object sender, EventArgs e)
    {
        StreamReader sr = new StreamReader("helyforr.txt");
        double[] x = new double[3124] //there is 3124 lines in the text;
        double[] y = new double[3124];
        while (!sr.EndOfStream)
        {
            string sor = sr.ReadLine();
            sor = sor.Replace('.', ','); //swap '.' to ',' make it double
            string[] r = sor.Split(' ');

            x[0] = Convert.ToDouble(r[0]);
            y[0] = Convert.ToDouble(r[1]);
            Graphics rl = this.CreateGraphics();
            rl.FillRectangle(new SolidBrush(Color.Blue), (Int32)x[0], (Int32)y[0], 1, 1);
        }
        sr.Close();
    }

然而它没有用,所以如果有人理解我的想法(和我可怕的英语)并能够帮助我,我会非常感激!

1 个答案:

答案 0 :(得分:1)

  1. 你没有看到任何东西,因为你的y坐标最有可能超出范围,或者你的表格真的高达2700+像素?

  2. 这不是在winforms中绘制任何内容的正确方法!而是这样做:

    • 创建List<Rectangle> plotpoints并在按钮点击中填写。或List<Point>List<someClassOrStruct> which could include a颜色`和/或文件中的文字......

    • 决定要绘制的Control。使用例如Form代替Panel更灵活。 Invalidate()

    • Panel plotPoints每次Panel列表更新

    • 使用事件参数中的Paint对象对Graphics&#39} PictureBox's Image事件进行编码!

  3. 为什么你的方式错了?好吧,如果你缩小数字,你会看到一些像素,但在你最小化形式和恢复后,它们将会消失。他们不执着!要创建持久性图形,您需要将绘制到 a Invalidate或使用任何控件的Paint事件,以便在控件的任何时候将绘制到控件上必要。这意味着当系统注意到需要或调用List<Rectangle> plotPoints = new List<Rectangle>(); private void button1_Click(object sender, EventArgs e) { StreamReader sr = new StreamReader("helyforr.txt"); double[] x = new double[3124] //there is 3124 lines in the text; double[] y = new double[3124]; int scale = 10; // I start with a scale down fastor of 10. // you could also calculate it taking the size of the canvas into account.. while (!sr.EndOfStream) { string sor = sr.ReadLine(); sor = sor.Replace('.', ','); //swap '.' to ',' make it double string[] r = sor.Split(' '); x[0] = Convert.ToDouble(r[0]) / scale; y[0] = Convert.ToDouble(r[1]) / scale; plotPoints.Add(new Rectangle( (Int32)x[0], (Int32)y[0], 1, 1)); } sr.Close(); canvasPanel.Invalidate(); } 函数时

  4. 所以你的按钮点击看起来像这样:

    Paint

    ,您的Panel canvasPanel事件对于private void canvasPanel_Paint(object sender, PaintEventArgs e) { foreach (Rectangle r in plotPoints) e.Graphics.FillRectangle(new SolidBrush(Color.Blue), r); }

    会是这样的
    List<PointF>
    1. 除了绘画问题还有其他问题;最值得注意的是,你已经对行数进行了硬编码。我建议用保存数字和文本的List<someStructure>或{{1}}替换这两个数组。这样你的程序就可以处理任何文件长度。