问候! 我想从一个看起来像这样的文本中读到:
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();
}
然而它没有用,所以如果有人理解我的想法(和我可怕的英语)并能够帮助我,我会非常感激!
答案 0 :(得分:1)
你没有看到任何东西,因为你的y坐标最有可能超出范围,或者你的表格真的高达2700+像素?
这不是在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
事件进行编码!
为什么你的方式错了?好吧,如果你缩小数字,你会看到一些像素,但在你最小化形式和恢复后,它们将会消失。他们不执着!要创建持久性图形,您需要将绘制到 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();
}
函数时
所以你的按钮点击看起来像这样:
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>
List<someStructure>
或{{1}}替换这两个数组。这样你的程序就可以处理任何文件长度。