GDI+绘图保存问题 c#
在一个form里面画出N个图形(圆,正方形等),点击保存按纽(到一个文件或其它方式),当下次运行这个form时,点击一个读取按纽(从一个文件或其它方式),就可以把保存的图...
在一个form里面画出N个图形(圆,正方形等),点击保存按纽(到一个文件或其它方式),当下次运行这个form时,点击一个读取按纽(从一个文件或其它方式),就可以把保存的图形读取出来。
这个想法,怎么实现? 展开
这个想法,怎么实现? 展开
1个回答
展开全部
这个很容易的。可以采用“文档-视图”的观念设计。
你把form里的图形用一个个的对象表示,在绘制时,根据UI的操作,生成这些对象,保存一个集合里就好了。
这些对象和对象池要声明为可序列化的,这样就不必自己去写序列代码了。
在保存时,调用集合对象的序列化函数,即可以保存。在打开时,调用集合类的反序列化函数,从文件创建那些对象。
最后,为form的paint事件实现订阅,固定循环你的对象池的对象,根据对象的属性来画图就好了。
我大概写个示意的代码和类设计,有打字错误请包涵:
// 图形对象基类
[serialize]
public abstract class sharp
{
public Point StartPoint{set;get;}
public abstract void Draw(Graphics g);
}
public class circle : sharp
{
public double R;
public override void Draw(Graphics g )
{
// 这里写绘制自己的代码
}
}
//对象集合管理类
[serialize]
public class shapcollection
{
public List<sharp> sharps = new List<Sharp>();
}
// form 类
public class My_Form:Form
{
....
private ShapCollection MySharps = new ShapCollection();
// 比如这里你的保存菜单被点了。
mnSaveSharpToFile_Clicked()
{
// 请在网上找一下对象序列化和反序列化的代码吧,很多很多的。
// 找到后,在这里对 this.MySharps序列化就行了。
}
// 比如这里你的打开菜单被点了
mnLoadSharpFromFile_Click()
{
// 请在网上找一下对象序列化和反序列化的代码吧,很多很多的。
// 找到后,在这里对 this.MySharps反序列化就行了。
}
Form_Paint(object sender , PaintAgruemnt e)
{
foreach(var sharp in this.MySharps.shaps)
{
sharp.Draw(e.graphics);
}
}
Form_mouseDown() // 还有mouse up 事件等处理
{
// 如果UI上的操作导致了一个图形的建立,就在这里创建这个图形的对象,加入对象列表
Circle c = new Circle();
c.???? = ?????;
.... ....
this.MySharps.Sharps.Add(c);
this.Invalidate();
}
}
你把form里的图形用一个个的对象表示,在绘制时,根据UI的操作,生成这些对象,保存一个集合里就好了。
这些对象和对象池要声明为可序列化的,这样就不必自己去写序列代码了。
在保存时,调用集合对象的序列化函数,即可以保存。在打开时,调用集合类的反序列化函数,从文件创建那些对象。
最后,为form的paint事件实现订阅,固定循环你的对象池的对象,根据对象的属性来画图就好了。
我大概写个示意的代码和类设计,有打字错误请包涵:
// 图形对象基类
[serialize]
public abstract class sharp
{
public Point StartPoint{set;get;}
public abstract void Draw(Graphics g);
}
public class circle : sharp
{
public double R;
public override void Draw(Graphics g )
{
// 这里写绘制自己的代码
}
}
//对象集合管理类
[serialize]
public class shapcollection
{
public List<sharp> sharps = new List<Sharp>();
}
// form 类
public class My_Form:Form
{
....
private ShapCollection MySharps = new ShapCollection();
// 比如这里你的保存菜单被点了。
mnSaveSharpToFile_Clicked()
{
// 请在网上找一下对象序列化和反序列化的代码吧,很多很多的。
// 找到后,在这里对 this.MySharps序列化就行了。
}
// 比如这里你的打开菜单被点了
mnLoadSharpFromFile_Click()
{
// 请在网上找一下对象序列化和反序列化的代码吧,很多很多的。
// 找到后,在这里对 this.MySharps反序列化就行了。
}
Form_Paint(object sender , PaintAgruemnt e)
{
foreach(var sharp in this.MySharps.shaps)
{
sharp.Draw(e.graphics);
}
}
Form_mouseDown() // 还有mouse up 事件等处理
{
// 如果UI上的操作导致了一个图形的建立,就在这里创建这个图形的对象,加入对象列表
Circle c = new Circle();
c.???? = ?????;
.... ....
this.MySharps.Sharps.Add(c);
this.Invalidate();
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询