我们C#的第一个小项目

仿记事本制作总结 改2.0

一.引子:
这是我们以小组的形式共同制作的记事本项目。项目的目的是仿照Windows系统上的文本文档,实现其中一些基本的功能,如新建和保存等。下面我将分享以下我们的想法和遇到的问题,欢迎大家提出意见或是更好的看法。

二. 项目的基本组成:

  1. 一个窗体的基本结构
    (1) 导航栏
    (2) 菜单栏
    (3) 文本编辑区
    (4) 状态栏
    我们C#的第一个小项目_第1张图片

  2. 具体的构思:
    我们把记事本当作是一个主窗体,让其拥有两个子窗体 格式 和 关于
    在菜单栏添加标签文件和文件下的下拉菜单

  3. 想要实现的功能
    (1) 新窗口
    (2) 打开
    (3) 保存 与 另存为
    (4) 格式(对字体进行修改)
    (5) 关于

  4. 具体实现的方法

    (1)新窗口:new一个主窗体并将其显示出来
    
 private void New_Click(object sender, EventArgs e)
        {
            FrmParents frmParents = new FrmParents();
            frmParents.Show();
        }
   (2)打开:使用 open file 类来查找文件的路径,使用字符串的截断来来取出文件的名称并将其显示伪文件名	   
    	private String fileString = "";
        private String textString = "";
        private String filePath = "";
 
        private void Open_Click(object sender, EventArgs e)
        {
            // 打开时,先清空文本框中的内容
            textBox1.Clear();
            OpenFileDialog file = new OpenFileDialog
            {
                Filter = "txt文件(*.txt)|*.txt"
            };
            if (file.ShowDialog() == DialogResult.OK)
            {
                filePath = file.FileName;
                StreamReader sr= new StreamReader(filePath, Encoding.GetEncoding("GB2312"));
                fileString = sr.ReadToEnd();
                // 用于退出和点击主窗体右上角的关闭判断的执行
                textString = fileString;
                textBox1.Text = textString;
                // 关闭数据流
                sr.Close();
            }
            this.Text = filePath.Substring(filePath.LastIndexOf('\\')+1)+" - 记事本";
        }
   (3)保存与另存为
 		// 保存
        private void Save_Click(object sender, EventArgs e)
        {
            // 判断文件路径是否存在
            if (filePath == "")
            {
                // 不存在 创建一个存储文件的框架
                SaveFileDialog file = new SaveFileDialog
                {
                    Filter = "txt文件(*.txt)|*.txt"
                };
                if (file.ShowDialog() == DialogResult.OK)
                {
                    filePath = file.FileName;
                    StreamWriter sw = new StreamWriter(filePath, false, Encoding.GetEncoding("GB2312"));
                    fileString = textString;
                    sw.Write(fileString);
                    sw.Flush();
                    sw.Close();
                }
            }
            else
            {
                // 存在 直接写入现有的文件中
                StreamWriter sw = new StreamWriter(filePath, false, Encoding.GetEncoding("GB2312"));
                fileString = textString;
                sw.Write(fileString);
                sw.Flush();
                sw.Close();
            }
            this.Text = "记事本";
        }
		// 另存为
        private void As_Click(object sender, EventArgs e)
        {
            SaveFileDialog file = new SaveFileDialog
            {
                Filter = "txt文件(*.txt)|*.txt"
            };
            if (file.ShowDialog() == DialogResult.OK)
            {
                filePath = file.FileName;
                StreamWriter sw = new StreamWriter(filePath, false, Encoding.GetEncoding("GB2312"));
                fileString = textString;
                sw.Write(fileString);
                sw.Flush();
                sw.Close();
            }
        }
   (4)格式 (已优化)
   		   在主窗体调用FontDialog插件 不在使用创建的子窗体
    // 点击格式会触发的事件
        private void Style_Click(object sender, EventArgs e)
        {
            // 要想更改字体的颜色, fontDialog1.ShowColor 必须在fontDialog1.ShowDialog前调用加载
            fontDialog1.ShowColor = true;
            fontDialog1.ShowDialog();
            textBox1.Font = fontDialog1.Font;
            textBox1.ForeColor = fontDialog1.Color;
        }

我们C#的第一个小项目_第2张图片
(5)关于 新建子窗体
我们C#的第一个小项目_第3张图片
注册一个点击事件,当点击按钮时,弹出子窗体
6. 遇到的bug以及解决方法:
(1)文本框溢出问题
原因是读取文档内字符串时,缺少修饰符“\0”从而导致堆栈的溢出问题
解决方案: 添加一个中间变量testString来判断文件内容是否有进行过更改
(2)无法使用格式获取的系统文字格式
原因:最早我们用的自己设计的子窗体,并同过获取了系统的文字格式,但是无法调用
解决方案: 在在主窗体上添加fontDialog控件

			// 以下是获取系统部分文字格式的代码,大家可以看一下
			// 获取字体列表
            InstalledFontCollection fonts = new InstalledFontCollection();
            foreach (FontFamily family in fonts.Families)
            {
          		// 在窗体上添加的控件comboBox
                ComboBoxFonts.Items.Add(family.Name);
            }

            // 获取字体样式
            foreach (int i in Enum.GetValues(typeof(FontStyle)))
            {
                ListItem listitem = new ListItem(Enum.GetName(typeof(FontStyle), i), i.ToString());
                ComboBoxFontStyle.Items.Add(listitem);
            }
            // 获取字体大小
            // 注意!这个获取的并不是字号,只是字体的大小   Large, Samll之类的
            foreach (int i in Enum.GetValues(typeof(FontSize)))
            {
                ListItem listitem = new ListItem(Enum.GetName(typeof(FontSize), i), i.ToString());
                ComboBoxFontSize.Items.Add(listitem);
            }

			 // 获取字体颜色
            foreach (int i in Enum.GetValues(typeof(FontColor)))
            {
                ListItem listitem = new ListItem(Enum.GetName(typeof(FontColor), i), i.ToString());
                ComboBoxFontColor.Items.Add(listitem);
            }
  1. 想要进行的优化
    (1) 子窗体至于顶层,且当子窗体存在时,主窗体无法实现任何功能。
    (2) 文档编辑可以添加图片
    (3) 记事本可以连接数据库并读入数据库中的信息
    (4) 把重复度过高的代码写入一个类中

你可能感兴趣的:(我们C#的第一个小项目)