C# - 将形状从包含描述每个形状的数据的文本文件加载到 PictureBox 中



我有完美的代码来加载和保存形状,其中包含形状的类型(我使用称为ShapeType的枚举(,x1,y1(初始鼠标按下位置(坐标和x2,y2(鼠标光标的最终位置,一旦鼠标被拖动到某个地方并释放左按钮(。该数据还将形状的颜色存储为 rgb int 和真/假值,用于将形状填充为实心还是仅填充轮廓。

我唯一要问的是我怎么能在我的文本文件中的一行上拥有完全相同的东西,但 1 个形状的所有数据仍然能够加载它。我知道如何将数据保存在一行上,但如果每个形状的所有内容都在一行上,我不知道我将如何加载数据......

现在的代码是:

private void loadCanvas(List<APShape> shapeList)
{
shapeList.Clear();
string line = "";
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Shape Data Files | *.shapes";
if (open.ShowDialog() == DialogResult.OK)
{
Stream s = File.Open(open.FileName, FileMode.Open);
StreamReader sr = new StreamReader(s);
while (line != null)
{
line = sr.ReadLine();
if (line != null)
{
shapeList.Add(ObjectFromTxt(line));
shapeList[shapeList.Count - 1].setColor(Color.FromArgb(int.Parse(sr.ReadLine())));
shapeList[shapeList.Count - 1].setX1(int.Parse(sr.ReadLine()));
shapeList[shapeList.Count - 1].setY1(int.Parse(sr.ReadLine()));
shapeList[shapeList.Count - 1].setX2(int.Parse(sr.ReadLine()));
shapeList[shapeList.Count - 1].setY2(int.Parse(sr.ReadLine()));
shapeList[shapeList.Count - 1].setSolid(string2bool(sr.ReadLine()));
shapeList[shapeList.Count - 1].setPenWidth(float.Parse(sr.ReadLine()));
}
}
sr.Close();
canvas.Invalidate();
}
}

包含形状数据的文本的文件的外观是: 当前文件格式

最终结果

private void saveCanvas()
{
SaveFileDialog save = new SaveFileDialog();
save.DefaultExt = ".shapes";
save.Filter = "Shapes File (*.shapes) |*.shapes";
if (save.ShowDialog() == DialogResult.OK)
{
File.Delete(save.FileName);
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, NullValueHandling = NullValueHandling.Ignore };
File.WriteAllText(save.FileName, JsonConvert.SerializeObject(shapes, shapes.GetType(), settings));
}
}

private void loadCanvas()
{
List<APShape> shapeList = new List<APShape>();
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Shapes File (*.shapes) |*.shapes";
if (open.ShowDialog() == DialogResult.OK)
{
shapes.Clear();       /* Clear canvas to make sure we are starting blank */
canvas.Invalidate();
var json = File.ReadAllText(open.FileName);
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, NullValueHandling = NullValueHandling.Ignore };
shapeList = JsonConvert.DeserializeObject<List<APShape>>(json, settings);
foreach (var shape in shapeList)
{
shapes.Add(shape);
}
canvas.Invalidate();      
}
}

最新更新