我刚刚完成本学期的三级项目:“小画家益智画板”。现在看来这个项目的思维算是比较简单清晰,不过也有一些涉及到GDI+的有关知识。我将在下面解释本项目的多个要点。
图像保存要点链接https://mp.csdn.net/postedit/103749717
以下为全部代码:
`using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace 三级项目12_11
{
public partial class Form1 : Form
{
public BufferedGraphicsContext currentContext;//定义双缓冲区
public BufferedGraphics myBuffer;
Bitmap b;//声明一个bitmap
public Graphics gra;//声明一个graphics
Point Start, Prev, End;//声明三个点用来划线与定义矩形
int penWidth;//声明笔的宽度
Pen pen, erase;//声明笔与橡皮
Color penColor;//声明笔的颜色
SolidBrush brush;//声明刷子用于填充
bool down = false;//判断是否点击
int point = 1;//point用于给保存的图片编号
int po = 0;//po用于给录制过程的步骤编号
string[,] data;//声明一个二维数组来保存录制过程的每一步的数据来输出
bool vidiook = false;//判断是否开始录制
FileStream fs;//声明一个文件流
int pp = 1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Form2 mdiChild = new Form2(this);//首先显示From2
mdiChild.ShowDialog();
b = new Bitmap(1024, 661);//实例化一个bitmap b
gra = Graphics.FromImage(b);//将b的图像给gra
toolStripStatusLabel2.Text = "画笔";//在左下角显示当前的画笔、颜色、粗细、鼠标位置等信息
toolStripStatusLabel3.Text = "黑色";
toolStripStatusLabel5.BackColor = Color.Black;
penWidth = 1;//定义初始的画笔宽度与颜色
penColor = Color.Black;
CreateNewPenAndBrush();
erase = new Pen(Color.White, 20);//定义橡皮的颜色与宽度
currentContext = BufferedGraphicsManager.Current;//双缓冲区
Rectangle rect = pictureBox1.ClientRectangle;
myBuffer = currentContext.Allocate(gra,
rect);
myBuffer.Graphics.Clear(pictureBox1.BackColor);
data = new string[100000, 5];//将一个1000*5的二维数组实例化
}
private void PictureBox1_MouseDown(object sender, MouseEventArgs e)
{
Start.X = e.X;//获取鼠标按下的位置
Start.Y = e.Y;
Prev = Start;
down = true;
data[po, 1] = Start.X.ToString() + "," + Start.Y.ToString();//将初始位置写在data数组中
}
private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
toolStripStatusLabel1.Text = "X:" + e.X.ToString()
+ ",Y:" + e.Y.ToString();//将当前位置显示在左下角
if (down)
{
Prev = e.Location;
CreateNewPenAndBrush();
Rectangle rect = Rectangle.Union(new Rectangle(Start, new Size(0, 0)),
new Rectangle(Prev, new Size(0, 0)));//利用初始位置与当前位置划矩形rect
switch (toolStripStatusLabel2.Text)
{
case "画笔":
End.X = e.X;
End.Y = e.Y;
myBuffer.Graphics.DrawLine(pen, Start, End);//利用drawline连续划线实现画笔功能
myBuffer.Render();//双缓冲区
Start = End;
data[po, 0] = "画笔";//将画笔种类、当前位置、颜色与粗细写在data里
data[po, 2] = End.X.ToString() + "," + End.Y.ToString();
data[po, 3] = System.Drawing.ColorTranslator.ToHtml(penColor);
data[po, 4] = penWidth.ToString();
po++;//开始下一个步骤
break;
case "直线":
myBuffer.Render();
gra.DrawLine(pen, Start, Prev);//实现直线跟随拖动
break;
case "长方形":
myBuffer.Render();
gra.DrawRectangle(pen, rect);
break;
case "橡皮":
myBuffer.Render();
End.X = e.X;
End.Y = e.Y;
myBuffer.Graphics.DrawLine(erase, Start, End);
myBuffer.Render();
Start = End;
break;
case "椭圆":
myBuffer.Render();
gra.DrawEllipse(pen, rect);
break;
case "填充矩形":
myBuffer.Render();
gra.FillRectangle(brush, rect);
break;
case "填充椭圆":
myBuffer.Render();
gra.FillEllipse(brush, rect);
break;
case "文字":
myBuffer.Render();
Pen wenzi = new Pen(Color.Blue,1);
gra.DrawRectangle(wenzi, rect);
break;
}
}
gra.Save();
pictureBox1.Image = b;
}
private void PictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (down)
{
End.X = e.X;
End.Y = e.Y;
CreateNewPenAndBrush();
Rectangle rect = Rectangle.Union(new Rectangle(Start, new Size(0, 0)),
new Rectangle(Prev, new Size(0, 0)));
switch (toolStripStatusLabel2.Text)
{
case "画笔":
End.X = e.X;
End.Y = e.Y;
myBuffer.Graphics.DrawLine(pen, Start, End);//在gra上绘出直线
data[po, 0] = "画笔";//将画笔种类存入data
break;
case "直线":
myBuffer.Graphics.DrawLine(pen, Start, Prev);
data[po, 0] = "直线";
break;
case "长方形":
myBuffer.Graphics.DrawRectangle(pen, rect);
data[po, 0] = "长方形";
break;
case "橡皮":
End.X = e.X;
End.Y = e.Y;
myBuffer.Graphics.DrawLine(erase, Start, End);
Start = End;
data[po, 0] = "橡皮";
break;
case "椭圆":
myBuffer.Graphics.DrawEllipse(pen, rect);
data[po, 0] = "椭圆";
break;
case "填充矩形":
myBuffer.Graphics.FillRectangle(brush, rect);
data[po, 0] = "填充矩形";
break;
case "填充椭圆":
myBuffer.Graphics.FillEllipse(brush, rect);
data[po, 0] = "填充椭圆";
break;
case "文字":
textBox1.Visible = true;
button23.Visible = true;
gra.Save();
pictureBox1.Image = b;
break;
}
down = false;
data[po, 2] = End.X.ToString() + "," + End.Y.ToString();//将结束点存入data
data[po, 3] = System.Drawing.ColorTranslator.ToHtml(penColor);
data[po, 4] = penWidth.ToString();
po++;
}
gra.Save();
pictureBox1.Image = b;
}
private void Button2_Click(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = "直线";//左下角显示内容
}
private void Button1_Click(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = "画笔";
}
private void Button3_Click(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = "长方形";
}
private void Button6_Click(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = "橡皮";
}
private void Button5_Click(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = "文字";
}
private void Button4_Click(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = "椭圆";
}
private void Button19_Click_1(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = "填充矩形";
}
private void Button20_Click(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = "填充椭圆";
}
private void Button7_Click(object sender, EventArgs e)
{
penColor = Color.Black;//更改画笔颜色
toolStripStatusLabel3.Text = "黑色";//左下角显示当前颜色
toolStripStatusLabel5.BackColor = Color.Black;//改变左下角一个toolstripstatuslable的backcolor
}
private void Button8_Click(object sender, EventArgs e)
{
penColor = Color.Red;
toolStripStatusLabel3.Text = "红色";
toolStripStatusLabel5.BackColor = Color.Red;
}
private void Button9_Click(object sender, EventArgs e)
{
penColor = Color.White;
toolStripStatusLabel3.Text = "白色";
toolStripStatusLabel5.BackColor = Color.White;
}
private void Button10_Click(object sender, EventArgs e)
{
penColor = Color.Yellow;
toolStripStatusLabel3.Text = "黄色";
toolStripStatusLabel5.BackColor = Color.Yellow;
}
private void Button11_Click(object sender, EventArgs e)
{
penColor = Color.Blue;
toolStripStatusLabel3.Text = "蓝色";
toolStripStatusLabel5.BackColor = Color.Blue;
}
private void Button12_Click(object sender, EventArgs e)
{
penColor = Color.Green;
toolStripStatusLabel3.Text = "绿色";
toolStripStatusLabel5.BackColor = Color.Green;
}
private void Button16_Click(object sender, EventArgs e)
{
penColor = Color.Pink;
toolStripStatusLabel3.Text = "粉色";
toolStripStatusLabel5.BackColor = Color.Pink;
}
private void Button17_Click(object sender, EventArgs e)
{
penColor = Color.Brown;
toolStripStatusLabel3.Text = "棕色";
toolStripStatusLabel5.BackColor = Color.Brown;
}
private void Button18_Click(object sender, EventArgs e)
{
colorDialog1.ShowDialog();//用colordialog窗体控件显示更多颜色
penColor = this.colorDialog1.Color;
toolStripStatusLabel3.Text = colorDialog1.Color.ToString();//将所选颜色显示到左下角
toolStripStatusLabel5.BackColor = this.colorDialog1.Color;//改变左下角一个toolstripstatuslable的backcolor
}
private void Button13_Click(object sender, EventArgs e)
{
penWidth = 1;//更换画笔的宽度
toolStripStatusLabel4.Text = "细";//在左下角显示当前的宽度
}
private void Button14_Click(object sender, EventArgs e)
{
penWidth = 3;
toolStripStatusLabel4.Text = "中";
}
private void Button15_Click(object sender, EventArgs e)
{
penWidth = 5;
toolStripStatusLabel4.Text = "粗";
}
private void TrackBar1_Scroll(object sender, EventArgs e)
{
penWidth = this.trackBar1.Value;//利用窗体控件trackbar调节画笔宽度
if (this.trackBar1.Value == 1)
toolStripStatusLabel4.Text = "细";
else if (this.trackBar1.Value == 3)
toolStripStatusLabel4.Text = "中";
else if (this.trackBar1.Value == 5)
toolStripStatusLabel4.Text = "粗";
else
toolStripStatusLabel4.Text = trackBar1.Value.ToString();
}
private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)//此部分实现所化内容的保存
{
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);//首先初始化一个与pictbox同样大小的bitma
pictureBox1.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));//使用picturebox的drawtobitmap方法将所画的内容截屏到bmp
saveFileDialog1.Filter = "Jpg 图片|*.jpg|Bmp 图片|*.bmp|Gif 图片|*.gif|Png 图片|*.png|Wmf 图片|*.wmf";//使用savefiledialog保存,保存为指定的图片格式
saveFileDialog1.FileName = "mytext" + point.ToString();//设置预设的文件名称
point++;//下次保存文件的文件名改变
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);//将bmp保存在选定的位置
MessageBox.Show(this, "图片保存成功!", "信息提示");//小窗口显示保存成功
}
}
private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)//此部分实现图片文件打开到画板上
{
OpenFileDialog dialog = new OpenFileDialog();//使用openfiledialog控件进行打开操作
dialog.Filter = "图片文件(*.png;*.jpg;*.bmp;*.jpeg)|*.png;*.jpg;*.bmp;*.jpeg";//只能打开特定格式的图片文件
if (dialog.ShowDialog() == DialogResult.OK)//如果点击确定
{
Image gg = Image.FromFile(dialog.FileName);//新定义一个image来过渡图片
myBuffer.Graphics.DrawImage(gg,0,0);//将gg画在双缓冲区
myBuffer.Render();//把所选图片附给picturebox
gra.Save();//保存图片
pictureBox1.Image = b;//绘在pictbox上
}
}
private void 自定义CToolStripMenuItem_Click(object sender, EventArgs e)
{
//定义开始录制过程
po = 0;
选项OToolStripMenuItem.Visible = true;//将看不见“开始录制”选项,只能看到“结束录制”
自定义CToolStripMenuItem.Visible = false;
vidiook = true;//告知后面开始录制
fs = new FileStream("过程.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);//新建或覆盖文档“过程.txt"
}
private void 读取过程pToolStripMenuItem_Click(object sender, EventArgs e)
{
button21.Visible = true;//显示被隐藏的“下一步”按钮
}
private void 新建NToolStripMenuItem_Click(object sender, EventArgs e)//此部分新建一个新的画布
{
Rectangle re = new Rectangle(0, 0, 1024, 661);//新建一个picturebox大小的矩形
Brush bru = new SolidBrush(Color.White);//设定一个白色的刷子
myBuffer.Graphics.FillRectangle(bru, re);//用白色的填充矩形覆盖实现新建
myBuffer.Render();
gra.Save();
pictureBox1.Image = b;
}
private void Button21_Click(object sender, EventArgs e)//此部分实现读取
{
StreamReader sr = new StreamReader("过程.txt", Encoding.Default);//定义一个读取器
try
{
string op = "";
for (int i = 0; i < pp; i++)//读取第po行的信息
{
op = sr.ReadLine();
}
string[] vs = op.Split(' ');
Start.X = int.Parse(vs[1].Substring(0, vs[1].IndexOf(',')));//将信息还原为点,画笔类型,颜色,宽度
Start.Y = int.Parse(vs[1].Substring(vs[1].IndexOf(',') + 1));
End.X = int.Parse(vs[2].Substring(0, vs[2].IndexOf(',')));
End.Y = int.Parse(vs[2].Substring(vs[2].IndexOf(',') + 1));
penColor = System.Drawing.ColorTranslator.FromHtml(vs[3]);
penWidth = int.Parse(vs[4]);
CreateNewPenAndBrush();//更新画笔
Size size = new Size(End.X - Start.X, End.Y - Start.Y);
Rectangle rect = new Rectangle(Start, size);
switch (vs[0])
{
case "画笔":
myBuffer.Graphics.DrawLine(pen, Start, End);
break;
case "直线":
myBuffer.Graphics.DrawLine(pen, Start, End);
break;
case "长方形":
myBuffer.Graphics.DrawRectangle(pen, rect);
break;
case "橡皮":
myBuffer.Graphics.DrawLine(erase, Start, End);
break;
case "椭圆":
myBuffer.Graphics.DrawEllipse(pen, rect);
break;
case "填充矩形":
myBuffer.Graphics.FillRectangle(brush, rect);
break;
case "填充椭圆":
myBuffer.Graphics.FillEllipse(brush, rect);
break;
}
pp++;//准备读取下一步
myBuffer.Render();//将读取结果显示在画布上
gra.Save();
pictureBox1.Image = b;
}
finally
{
sr.Close();//关闭streamreader
}
}
private void Button23_Click(object sender, EventArgs e)//此部分实现文字的写入
{
CreateNewPenAndBrush();//更换画笔
PointF pointF=new PointF();//定义新的浮点数位置以使用drawstring
pointF.X = (float)Start.X;
pointF.Y = (float)Start.Y;
Font font = new Font("宋体", 9);//确定文字的字体
myBuffer.Graphics.DrawString(textBox1.Text,font,brush,pointF);//将文字显示在双缓冲区
gra.Save();
pictureBox1.Image = b;
button23.Visible = false;//隐藏textbox,button,使之只在点击文字是出现
textBox1.Visible = false;
}
private void 撤消UToolStripMenuItem_Click(object sender, EventArgs e)
{
po--;//返回上一个过程
Color color = Color.White;
Pen newpen;//定义白色与白色的画笔刷子,以实现覆盖
newpen = new Pen(color, penWidth);
Brush newbrush = new SolidBrush(color);
Start.X = int.Parse(data[po, 1].Substring(0, data[po, 1].IndexOf(',')));//读取上一过程的信息
Start.Y = int.Parse(data[po, 1].Substring(data[po, 1].IndexOf(',') + 1));
End.X = int.Parse(data[po, 2].Substring(0, data[po, 2].IndexOf(',')));
End.Y = int.Parse(data[po, 2].Substring(data[po, 2].IndexOf(',') + 1));
Size size = new Size(End.X - Start.X, End.Y - Start.Y);
Rectangle rect = new Rectangle(Start, size);
switch (data[po, 0])
{
case "画笔":
myBuffer.Graphics.DrawLine(newpen, Start, End);
break;
case "直线":
myBuffer.Graphics.DrawLine(newpen, Start, End);
break;
case "长方形":
myBuffer.Graphics.DrawRectangle(newpen, rect);
break;
case "橡皮":
myBuffer.Graphics.DrawLine(erase, Start, End);
break;
case "椭圆":
myBuffer.Graphics.DrawEllipse(newpen, rect);
break;
case "填充矩形":
myBuffer.Graphics.FillRectangle(newbrush, rect);
break;
case "填充椭圆":
myBuffer.Graphics.FillEllipse(newbrush, rect);
break;
}
myBuffer.Render();
gra.Save();
pictureBox1.Image = b;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (button21.Visible == true)
{
if (e.KeyCode == Keys.Enter)
{
StreamReader sr = new StreamReader("过程.txt", Encoding.Default);//定义一个读取器
try
{
string op = "";
for (int i = 0; i < pp; i++)//读取第po行的信息
{
op = sr.ReadLine();
}
string[] vs = op.Split(' ');
Start.X = int.Parse(vs[1].Substring(0, vs[1].IndexOf(',')));//将信息还原为点,画笔类型,颜色,宽度
Start.Y = int.Parse(vs[1].Substring(vs[1].IndexOf(',') + 1));
End.X = int.Parse(vs[2].Substring(0, vs[2].IndexOf(',')));
End.Y = int.Parse(vs[2].Substring(vs[2].IndexOf(',') + 1));
penColor = System.Drawing.ColorTranslator.FromHtml(vs[3]);
penWidth = int.Parse(vs[4]);
CreateNewPenAndBrush();//更新画笔
Size size = new Size(End.X - Start.X, End.Y - Start.Y);
Rectangle rect = new Rectangle(Start, size);
switch (vs[0])
{
case "画笔":
myBuffer.Graphics.DrawLine(pen, Start, End);
break;
case "直线":
myBuffer.Graphics.DrawLine(pen, Start, End);
break;
case "长方形":
myBuffer.Graphics.DrawRectangle(pen, rect);
break;
case "橡皮":
myBuffer.Graphics.DrawLine(erase, Start, End);
break;
case "椭圆":
myBuffer.Graphics.DrawEllipse(pen, rect);
break;
case "填充矩形":
myBuffer.Graphics.FillRectangle(brush, rect);
break;
case "填充椭圆":
myBuffer.Graphics.FillEllipse(brush, rect);
break;
}
pp++;//准备读取下一步
myBuffer.Render();//将读取结果显示在画布上
gra.Save();
pictureBox1.Image = b;
}
finally
{
sr.Close();//关闭streamreader
}
}
}
if (e.Control && e.KeyCode == Keys.A)
{
Rectangle re = new Rectangle(0, 0, 1024, 661);//新建一个picturebox大小的矩形
Brush bru = new SolidBrush(Color.White);//设定一个白色的刷子
myBuffer.Graphics.FillRectangle(bru, re);//用白色的填充矩形覆盖实现新建
myBuffer.Render();
gra.Save();
pictureBox1.Image = b;
}
if (e.Control && e.KeyCode == Keys.D)
{
OpenFileDialog dialog = new OpenFileDialog();//使用openfiledialog控件进行打开操作
dialog.Filter = "图片文件(*.png;*.jpg;*.bmp;*.jpeg)|*.png;*.jpg;*.bmp;*.jpeg";//只能打开特定格式的图片文件
if (dialog.ShowDialog() == DialogResult.OK)//如果点击确定
{
Image gg = Image.FromFile(dialog.FileName);//新定义一个image来过渡图片
myBuffer.Graphics.DrawImage(gg, 0, 0);//将gg画在双缓冲区
myBuffer.Render();//把所选图片附给picturebox
gra.Save();//保存图片
pictureBox1.Image = b;//绘在pictbox上
}
}
if (e.Control && e.KeyCode == Keys.S)
{
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);//首先初始化一个与pictbox同样大小的bitma
pictureBox1.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));//使用picturebox的drawtobitmap方法将所画的内容截屏到bmp
saveFileDialog1.Filter = "Jpg 图片|*.jpg|Bmp 图片|*.bmp|Gif 图片|*.gif|Png 图片|*.png|Wmf 图片|*.wmf";//使用savefiledialog保存,保存为指定的图片格式
saveFileDialog1.FileName = "mytext" + point.ToString();//设置预设的文件名称
point++;//下次保存文件的文件名改变
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);//将bmp保存在选定的位置
MessageBox.Show(this, "图片保存成功!", "信息提示");//小窗口显示保存成功
}
}
}
private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
private void Button22_Click(object sender, EventArgs e)
{
Form3 mdiChild = new Form3(this);//首先显示From2
mdiChild.ShowDialog();
button22.Visible = false;
button24.Visible = true;
Rectangle re = new Rectangle(0, 0, 1024, 661);//新建一个picturebox大小的矩形
Brush bru = new SolidBrush(Color.White);//设定一个白色的刷子
myBuffer.Graphics.FillRectangle(bru, re);//用白色的填充矩形覆盖实现新建
myBuffer.Render();
gra.Save();
pictureBox1.Image = b;
}
private void Button24_Click(object sender, EventArgs e)
{
Form4 mdiChild = new Form4(this);//首先显示From2
mdiChild.ShowDialog();
this.Close();
}
private void 重复RToolStripMenuItem_Click(object sender, EventArgs e)
{
po--;//回到上一个过程
Pen newpen;
newpen = new Pen(penColor, penWidth);//沿用上一步的颜色与宽度
Brush newbrush = new SolidBrush(penColor);
Start.X = int.Parse(data[po, 1].Substring(0, data[po, 1].IndexOf(',')));//读取上一过程的信息
Start.Y = int.Parse(data[po, 1].Substring(data[po, 1].IndexOf(',') + 1));
End.X = int.Parse(data[po, 2].Substring(0, data[po, 2].IndexOf(',')));
End.Y = int.Parse(data[po, 2].Substring(data[po, 2].IndexOf(',') + 1));
Size size = new Size(End.X - Start.X, End.Y - Start.Y);
Rectangle rect = new Rectangle(Start, size);
switch (data[po, 0])//对上一过程重绘
{
case "画笔":
myBuffer.Graphics.DrawLine(newpen, Start, End);
break;
case "直线":
myBuffer.Graphics.DrawLine(newpen, Start, End);
break;
case "长方形":
myBuffer.Graphics.DrawRectangle(newpen, rect);
break;
case "橡皮":
myBuffer.Graphics.DrawLine(erase, Start, End);
break;
case "椭圆":
myBuffer.Graphics.DrawEllipse(newpen, rect);
break;
case "填充矩形":
myBuffer.Graphics.FillRectangle(newbrush, rect);
break;
case "填充椭圆":
myBuffer.Graphics.FillEllipse(newbrush, rect);
break;
}
myBuffer.Render();
gra.Save();
pictureBox1.Image = b;
}
private void 选项OToolStripMenuItem_Click(object sender, EventArgs e)//此部分实现录制过程的存入
{
if(vidiook)
{
StreamWriter sw = new StreamWriter(fs, Encoding.Default);//声明一个streamwrite用于将文件存入
try
{
for (int i = 0; i < 100000; i++)
{
if (data[i, 0] != null)//逐条将data的内容writeline入“过程.txt”
{
sw.WriteLine(data[i, 0] + " " + data[i, 1] + " " + data[i, 2]+" "+data[i,3]+" "+data[i,4]);
}
else
break;
}
}
finally
{
sw.Close();
fs.Close();
}
}
}
void CreateNewPenAndBrush()
{
pen = new Pen(penColor, penWidth);//定义方法更换画笔的颜色与宽度
brush = new SolidBrush(penColor);
}
}
}
`