完成了目标一、目标二和目标三
目标一:“简易记事本”开发
要求:金旭亮老师课程内容一样,1.打开一个txt文件,进行修改并保存。2.创建一个新的txt文件保存
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace MyNotePad
{
public partial class frmEditor : Form
{
public frmEditor()
{
InitializeComponent();
}
private String OriginalContent = "";
private String _FileName = "";
public String FileName
{
get
{ return _FileName; }
set
{
_FileName = value;
Text = Path.GetFileName(value) + "-我的记事本";//得到FileName的值
}
}
private void label1_Click(object sender, EventArgs e)
{
}
private void timer1_Tick(object sender, EventArgs e)
{
lblTimer.Text = DateTime.Now.ToString();
}
private void frmEditor_Load(object sender, EventArgs e)
{
lblTimer.Text = "";
lblInfo.Text = "";
Text = "无标题-我的记事本";
}
private void btnOpen_Click(object sender, EventArgs e)
{
Open();
}
private void Open()
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)//按打开键,按确认后
{
FileName = openFileDialog1.FileName;//把文件名赋给FileName
try
{
OriginalContent = File.ReadAllText(FileName);//读取这个文件的内容赋给OriginalContent
txtEditor.Text = OriginalContent;//内容在文本框中显示
}
catch (Exception)
{
lblInfo.Text = "无法打开文件";
}
}
}
private void Save()//保存文件
{
bool ShouldSave = false;
//如果文件名不为空,表明当前是文本框中的内容是来自于文件
if (FileName != "")
{
//如果内容己更改
if (txtEditor.Text != OriginalContent
&& MessageBox.Show("文件己修改,保存吗?",
"保存文件",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
ShouldSave = true;//修改已更改,标记为True
}
}
else
{
//如果用户输入了内容,并且指定了一个文件名
if (txtEditor.Text != "" && saveFileDialog1.ShowDialog() == DialogResult.OK)
{
FileName = saveFileDialog1.FileName;
ShouldSave = true;
}
}
if (ShouldSave)//ShouldSave标记为true后
{
try
{
File.WriteAllText(FileName, txtEditor.Text);
OriginalContent = txtEditor.Text;
lblInfo.Text = "文件己保存";
}
catch (Exception)
{
lblInfo.Text = "文件保存失败";
}
}
}
private void txtEditor_TextChanged(object sender, EventArgs e)
{
}
private void btnSave_Click(object sender, EventArgs e)
{
Save();
}
private void frmEditor_FormClosing(object sender, FormClosingEventArgs e)//按了关闭键后要进行的
{
Save();
}
}
}
运行结果截图:
图1:运行主页;图二:输入内容,另存为;图三:打开已存在的txt文件;图四:标题已改为打开的文件名
体会感想:这个简易记事本是跟着金旭亮老师一步一步完成的,对于整个WinForm开发有了一定的了解,对于控件的一些常用属性也有了一定的了解和认识。也了解了开发的一些细节,例如老师教了一个编程规范,不要把功能代码直接写到控件响应的事件中,可选中代码,右键--重构-提取方法。学习了一个anchor属性,十分实用。另外,对于中间的部分代码还有待学习和实践,不能很好理解透彻,需要加强使用实践。
目标二:“顺序图片显示器”开发
要求:有5张图片(编号分别为1.jpg,2.jpg,……,5.jpg),窗体有3个控件(PictureBox,2个按钮);窗体刚开始显示”1.jpg“,按”上一张“则显示”5.jpg“(循环显示),按”下一张“则显示”2.jpg“,依此类推。
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
int i; string[] pictureName = { @"F:\\picture\\1.jpg", @"F:\\picture\\2.jpg", @"F:\\picture\\3.jpg", @"F:\\picture\\4.jpg", @"F:\\picture\\5.jpg" };
private void NextPic_Click(object sender, EventArgs e)
{
Next();
}
private void Next()
{
i++;
if (i > 4)
{ i = 0; }
pictureBox1.Image = new Bitmap(pictureName[i]);
}
private void LastPic_Click(object sender, EventArgs e)
{
Last();
}
private void Last()
{
i--;
if (i < 0)
{
i = 4;
}
pictureBox1.Image = new Bitmap(pictureName[i]);
}
}
}
运行结果截图:
到第一张按“上一张”到第五张图片,到第五张按“下一张”循环到第第一张,如此类推
体会感想:先完成控件的一些基本设置,到代码部分,把图片的路径放到一个数组中,要点在于循环的那里,我写了个if语句来实现这个循环,还有一个小细节就是打开的时候的显示,要在控件的Image属性中放入第一张照片,否则一运行,是空白的。这个是用PictureBox做的,我尝试用了ImageList这个控件做,这个控件用起来就比较方法,但是有个缺点就是像素很低,即使挑到最大的像素照片还是被压缩了,显示得不清楚。
目标三:“随机图片显示器”开发,并记录自程序运行后每张图片已经显示的次数,把次数保存到文本文件中
目标:有若干张图片(自己确定,不少于5张,命名方法自定),窗体有3个控件(PictureBox,按钮,label);按下“随机显示”按钮,则随机显示一张图片,并给出该图片显示的次数在右边的label中;同时在“关闭”窗体时,把每张图片目前已经显示的次数写入到指定文件中,方便下次程序运行时使用。
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace RandomPic
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Random1();
}
string[] pictureName = { @"F:\\RandomPicture\\1.jpg", @"F:\\RandomPicture\\2.jpg", @"F:\\RandomPicture\\3.jpg", @"F:\\RandomPicture\\4.jpg", @"F:\\RandomPicture\\5.jpg", @"F:\\RandomPicture\\6.jpg" };
static FileStream fs1 = new FileStream("F:\\1.txt", FileMode.Open);
static StreamReader sr = new StreamReader(fs1);
static string aa = sr.ReadLine(); int a = int.Parse(aa);
static string bb = sr.ReadLine(); int b = int.Parse(bb);
static string cc = sr.ReadLine(); int c = int.Parse(cc);
static string dd = sr.ReadLine(); int d = int.Parse(dd);
static string ff = sr.ReadLine(); int f = int.Parse(ff);
static string gg = sr.ReadLine(); int g = int.Parse(gg);
public void Random1()
{
Random r = new Random();
int RandKey = r.Next(0, 6);
pictureBox1.Image = new Bitmap(pictureName[RandKey]);
if (RandKey == 0)
{
a++;
label1.Text = "显示次数:" + a.ToString();
}
else if (RandKey == 1)
{
b++;
label1.Text = "显示次数:" + b.ToString();
}
else if (RandKey == 2)
{
c++;
label1.Text = "显示次数:" + c.ToString();
}
else if (RandKey == 3)
{
d++;
label1.Text = "显示次数:" + d.ToString();
}
else if (RandKey == 4)
{
f++;
label1.Text = "显示次数:" + f.ToString();
}
else if (RandKey == 5)
{
g++;
label1.Text = "显示次数:" + g.ToString();
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
sr.Close();
StreamWriter sw = new StreamWriter("F:\\1.txt", false);
sw.WriteLine("{0}\r\n{1}\r\n{2}\r\n{3}\r\n{4}\r\n{5}", a, b, c, d, f, g);
sw.Close();
fs1.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
Text = "随机显示照片";
}
}
}
注意事项:要在F盘建立个1.txt文件,并且输入六行0,每行一个0,相当于初始化;有一个文件夹放六张使用的照片,依次改名为1.jpg~6.jpg,注意程序的路径。
运行结果截图:
体会感想:这次的要点在于怎么从txt读出原来的数据,和运行后把数据后重新写入txt中。我先做出可以随机显示,可以叠加显示次数,难点在于读写。原本想着每修改一次就写入一次,发现有很多问题,我就想到在关闭的时候一次写入,读的时候一次读出。出现过写入的数据没能把原来的覆盖,这句StreamWriter sw = new StreamWriter("F:\\1.txt", false);是关键,要设置为false。途中还遇到很多读写的问题,后来去查资料了解清楚StreamReader,StreamWrite等用法。