字符编码转换练习绘图程序实现及数据保存

54 篇文章 1 订阅

数据结构与算法分析

实验四

1 字符编码转换练习

要求:创建一个窗体程序,在输入框1中输入以下字符,然后在选择框中选择一种编码,点编码转换按钮,在输入框2中显示转换后的编码。

输入字符文本:“鎴愰兘鐞嗗伐澶у鐨勬牎璁槸锛氱┓绌朵簬鐞嗭紝鎴愬氨浜庡伐锛”

实现步骤及过程:

  1. 获取输入框1中的文本,text1

(2)将text1转换成字节流bytes

(3)根据选择框中的选择,确定一个编码,然后采用此编码将字节流bytes转换成字符串。

(4)将text2显示到输入框2中

2 绘图程序实现及数据保存

要求:创建如下绘图程序,完成折线绘制、矩形绘制功能,并实现绘图的撤销与重做、图形的保存与读入等功能,实现线型的设置功能(线宽度和颜色设定)。

窗口界面如下

菜单设置如下

点线型设置菜单,弹出如下线型设置窗口。

在窗口输入线宽度,点击颜色框,弹出如下颜色选择框,

选择一个颜色,点确定后,返回线型设置对话框并刷新当前选择的颜色。

点确定按钮退出线型设置对话框,然后应用新的线宽和颜色绘制直线。(不影响已绘制直线)

实现步骤:

  1. 设计基本图形类Shape

基类定义

   …

枚举类型定义如下

  1. 创建线类(从基类派生)

  1. 创建矩形类(从基类派生)

  1. 基类预留绘制函数Draw,Save函数,Read函数接口
  1. 定义线型结构LineStyle,并在基类中定义线性结构变量lineStyle,

线型结构体如下:

基类线型变量lineStyle定义

  1. 在派生类中实现绘制,保存,和载入

写入文件操作

读文件操作

  1. 修改派生类的Draw绘制方法,添加线型的应用,为绘制的图形添加线条颜色和宽度。
  1. 在窗口类定义Shape对象的撤销栈undoStack,重做栈redoStack
  1. 实现窗口图形绘制菜单,撤销重做按钮等功能

窗口图形对象的绘制方法

  1. 在窗口类中添加当前线型变量curLineStyle
  2. 创建一个新的线型设置窗口PenDlg,用于设定当前线型宽度和颜色。

步骤:添加一个新的Form如(PenDlg),在窗口类中添加当前线型变量lineStyle

在窗体中添加一个PictureBox控件作为当前颜色的绘制.

响应Paint消息,在控件上绘制颜色,绘制代码如下。

响应PictureBox鼠标点击事件,实现颜色选择操作。点击颜色控件,弹出颜色对话框并选择颜色。代码如下:

响应确定按钮,将当前的线宽度和颜色赋值给线型变量lineStyle

  1. 在绘图窗口中响应线型设置菜单点击事件,将当前线型赋给线型窗口对象,调用线型设置窗口程序完成线宽度和颜色修改,将修改后的线型保存到窗口变量curLineStyle
  1. 在鼠标响应中在添加线和矩形前,将当前线型lineStyle赋值给图形对象。
  2. 实现保存,载入功能

保存数据

写入文件

从文件读入

(1) 设计基本图形类Shape 基类定义 virtual public void Draw(Graphics g) { } public enum DrawType { Line = 0, Rectangle = 1 } public DrawType Type; public LineStyle LineStyle; public List<PointF> Points = new List<PointF>(); 枚举类型定义如下 enum DrawingMode { None = 0, Line = 1, Rectangle =2 }

(2) 创建线类(从基类派生)public class Line : Shape{ public Line() { Type = DrawType.Line; LineStyle = new LineStyle(); // 初始化线型 } public List<Point>Points = new List<Point>(); override public void Draw(Graphics g) { //g.DrawLines(Pens.Black, Points.ToArray()); Pen pen = new Pen(LineStyle.Color, LineStyle.Width); // 绘制直线 g.DrawLine(pen, Points[0], Points[1]); }(1) 创建矩形类(从基类派生) internal class MyRectangle: Shape { public Point p0; public int width = 0; public int height = 0; override public void Draw(Graphics g) { g.DrawRectangle(Pens.Black, p0.X, p0.Y,width, height); } }

(4) 基类预留绘制函数Draw,Save函数,Read函数接口public virtual void Draw(Graphics g){ public virtual void Write(BinaryWriter br){ public virtual void Read (BinaryReader br)

(5) 定义线型结构LineStyle,并在基类中定义线性结构变量lineStyle, 线型结构体如下 public struct LineStyle { public float Width; public Color Color;

public LineStyle(bool init = true) { Width = 1.0f; Color = Color.Black; } } 基类线型变量lineStyle定义public class Shape{ public LineStyle lineStyle; (6) 在派生类中实现绘制,保存,和载入 写入文件操作 public override void Write(BinaryWriter br){ br.Write((int)type);//写入当前图形对象的类型br.Write(lineStyle.width) ; (/写入当前对象的线宽度br.Write(lineStyle.color.R);//写入当前对象的颜色R分量br.Write(lineStyle.color.G);//写入当前对象的颜色G分量br. Write(lineStyle.color.B);//写入当前对象的颜色B分量br. Write(points.Count);//写入当前对象的点个数 double x,y; for (int i = 0; i < points.Count; i++){ x = points[i].X;y = points[i].Y;br.Write(x) ; br.Write(y) ; 读文件操作public override void Read (BinaryReader br){ double x,y; points.Clear(;//清除当前点数组 type = (DrawType) br.ReadInt32();//读入当前图形对象的类型lineStyle.width = br.ReadSingle() ;//读入当前线宽度 byte r = br.ReadByte();//读入当前对象的颜色R分量byte g = br.ReadByte() ;//读入当前对象的颜色G分量byte b = br.ReadByte();//读入当前对象的颜色B分量lineStyle.color = Color.FromArgb(r,g, b);//构建颜色int count = br.ReadInt32();//读入当前图形对象的坐标点数//依次读入坐标点并添加到数组中 for (int i = 0; i < count ; i++){ x = br.ReadDouble();y = br.ReadDouble() ; points.Add (new PointF((float)x,(float)y)) ; } (7) 修改派生类的Draw绘制方法,添加线型的应用,为绘制的图形添加线条颜色和宽度。

public override void Draw (Graphics g) Pen pen = new Pen(lineStyle.color,lineStyle.width) ;for (int i = 0; i < points.Count - l; i++) g. DrawLine (pen,p1,p2);(

8) 在窗口类定义Shape对象的撤销栈undoStack,重做栈redoStackpublic partial class Forml : Form{ Stack<Shape> undoStack = new Stack<Shape>() ;Stack<Shape> redoStack = new Stack<Shape>() ;

(9) 实现窗口图形绘制菜单,撤销重做按钮等功能 窗口图形对象的绘制方法 void Draw (Graphics g){ Shape[ objs = undoStack.ToArray () ;for (int i=0; i< objs.Length;i++){ objs[i].Draw(g) ;

(10) 在窗口类中添加当前线型变量curLineStyle (11) 创建一个新的线型设置窗口PenDlg,用于设定当前线型宽度和颜色。 步骤:添加一个新的Form如(PenDlg),在窗口类中添加当前线型变量lineStyle public partial class PenDlg : Form{ public LineStyle linesty1e;在窗体中添加一个PictureBox控件作为当前颜色的绘制. 响应Paint消息,在控件上绘制颜色,绘制代码如下。 private void PenDlg_Paint(object sender,PaintEventArgs e){ Graphics g = pictureBox1.CreateGraphics () ; Brush brush = new SolidBrush( lineStyle.color );//去lineStyle中的颜色int width = pictureBox1.Width; int height = pictureBox1.Height ; g.FillRectangle(brush,0,0, width,height);//用指定颜色的画刷填充控件响应PictureBox鼠标点击事件,实现颜色选择操作。点击颜色控件,弹出颜色对话框并选择颜色。代码如下ColorDialog cd = new ColorDialog(); cd.Color = lineStyle.color;//传入当前的颜色if( cd.ShowDialog() == DialogResult.OK){ lineStyle.color = cd.Color;//获取已选择的颜色响应确定按钮,将当前的线宽度和颜色赋值给线型变量lineStyleprivate void OK_Click(object sender,EventArgs e){ linestyle.Width = Convert.ToInt32(textBox1.Text);//获取线宽度DialogResult = DialogResult.OK;/对话框返回值设定为OK(12) 在绘图窗口中响应线型设置菜单点击事件,将当前线型赋给线型窗口对象,调用线型设置窗口程序完成线宽度和颜色修改,将修改后的线型保存到窗口变量curLineStylePenDlg pd = new PenDlg( ; pd.linestyle = curLineStyle; //先传入当前的线型参数 if ( pd.ShowDialog() == DialogResult.OK )//线型设置对话框点了确定按钮{ curLineStyle = pd.lineStyle;//获取最新的线型参数

(13) 在鼠标响应中在添加线和矩形前,将当前线型lineStyle赋值给图形对象。 (14) 实现保存,载入功能 保存数据 写入文件 private void saveloolStripMenultem_Click(object sender,EventArgs e{ SaveFileDialog sd = new SaveFileDialog( ; sd.Filter ="图形文件file(.dat)|.dat|all files(.)|.";if (sd.ShowDialog() == DialogResult.OK)//调用文件保存对话框{ string filename = sd.FileName;//获取保存数据文件名//将当前栈中图形对象写入文件 Shape[] objs = undoStack.ToArray () ; FileStream fs = new FileStream(filename,FileMode.Create);BinaryWriter br = new BinaryWriter(fs); br. Write(objs.Length);//写入图形对象的个数for (int i = 0; i < objs.Length; i++) { objs[i].Write(br); } br.Close( ;从文件读入 OpenFileDialog od = new OpenFileDialog() ; od.Filter = "图形文件 file(.dat)|.dat |all files(.)|.";if (od.ShowDialog() == DialogResult.OK)//调用文件打开对话框{ string filename = od.FileName ;//获取打开数据文件名//将当前文件中的图形对象读入到undo栈中 undoStack.Clear () ; redoStack.Clear( ; FileStream fs = new FileStream(filename,FileMode.Open) ;BinaryReader br = new BinaryReader(fs); int count = br.ReadInt32();//读入图形对象的个数for (int i = 0; i < count; i++) { Shape obj = new Shape) ;obj.Read(br); undoStack.Push(obj) ; } br.Close() ; }

附1 —— C#编码名称和代码对应表

代码页

名称

显示名称

37

IBM037

IBM EBCDIC(美国 - 加拿大)

437

IBM437

OEM 美国

500

IBM500

IBM EBCDIC(国际)

708

ASMO-708

阿拉伯字符 (ASMO 708)

720

DOS-720

阿拉伯字符 (DOS)

        

需要可私信获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星尘库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值