2.用C#中Windows窗体应用(.NET Framework)编写一个简易的记事本项目

用C#编写一个简易记事本的项目



前言

例如:小项目记事本对初学者了解C#控件和和巩固基础代码的有很大的帮助,这里只实现了几个基础的功能供大家学习参考,并且可以自行延拓,下面就是整个小项目的具体实现过程(源码可在本人资源里下载)。


一、新建Windows窗体应用(.NET Framework)的项目文件

对新项目命名为NotePad在新建好的项目删除原窗体Form.cs,重新添加两个窗体,一个名为父窗体.cs,一个名为子窗体.cs。

二、编辑基本控件

添加控件之前我们先编辑“子窗体.cs”,打开“子窗体.cs”的窗体设计器,修改属性Text为空。然后我们可以在左侧工具箱(如果没有在视图里面添加)看到全部控件,下面分为五个步骤编辑基本控件:
1.在子窗体中拖进一个控件ToolStrip(在菜单和工具栏里)。
2.
①.在ToolStrip控件里面依次添加五个Button按钮,这里Button按钮的Text属性分别改为新建、打开、保存、加粗、倾斜;
②对于这五个按钮的图片,可以在网上找(这里我用的是阿里巴巴矢量图标库),对于这五个按钮,我们随便选中一个按钮,在右下角的image属性里面的项目资源文件中导入所需的图片,然后在属性中将它们的image分别换成对应的图片;
③显示样式(属性Displaystyle)里面选择ImageAndText,这样会同时显示图片和对应控件的名字(Text);
④文本图像关系(属性TextImageRelation)这里改成了将图片放置文字上方(属性为ImageAboveText)。
3.在ToolStrip控件里面依次添加两个comboBox控件分别将属性Text为字体和字号,对于字号按钮可以在属性item里面手动添加数字,也可以写一个循环在“加载”(即FrmChild_Load)事件里(可以在事件里面打开Load,也可以直接双击窗体本身),对于字体控件将size中的width改到差不多200-300,我这里修改成了200,同时字号控件也改为了200,字号的Text可以初始化为10.5(即五号字体)。
4.在ToolStrip控件里面添加一个Label,将其名字(Name)和文本(Text)均改为toolStripLabel1。
5.在工具栏下方拖入text控件,这个就是记事本输入文本的地方。
①将它的multiline属性改为true,这样我们可以编写多行的文本。
②修改它的BordStyle为FixedSingle,这样会给记事本添加一个边框。
③然后将ScrollBars为Both,这样给文本框添加了一个滚动条。
④最后是将Dock改为Fill,这样我们带有滚动条的text会铺满整个load。
6.统一修改控件名字,这样在代码中引用名字的时候更加清晰,我这里直接将它们的名字属性改成了中文名+控件(如文本框控件),最后在工具箱对话框里面加入OpenFileDialog和SaveFileDialog这个方便后续对记事本对象进行打开和保存。

三、编写各个控件相关的代码模块(在子窗体.cs中)

我们新建立好的项目会初始化如下的代码,namespace是该项目的命名空间,里面共有的子窗体是Form的一个实例化对象,也是我们设计的记事本子窗体模块,InitializeComponent()方法实现界面设计的变现内容,这里要另导入三个命名空间,后续实现模块会用的到。
using System.Drawing.Text;
using System.Collections;
using System.IO;

namespace NotePad
{
    public partial class 子窗体 : Form
    {
        //初始化事件
        public 子窗体()
        {
            InitializeComponent();
        }
    }
}

我们在学习写代码做项目的时候,一定要尽量做到,高内聚,低耦合,这样无论是在理解代码块方面的时候,还是在后续有问题要修改代码的时候,都会好很多,下面是各个模块设计的相应代码,可以双击相应的控件打开对应的事件,然后进行编辑,每个代码块基本相对独立,读者可以从前往后依次编辑,逐步体会这种编写思路。
1.窗体本身模块

 //窗体加载事件
 private void FrmChild_Load(object sender, EventArgs e)
 {
     //窗体加载时,要加载系统字体,方便后续选择字体,这里先实例化一个myFonts对象
     InstalledFontCollection myFonts = new InstalledFontCollection();
     //将实例化对象myFonts的数组Families赋值给刚定义的一个数据类型为FontFamily类的数组ff,
     FontFamily[] ff = myFonts.Families;
     //声明一个ArrayList变量,用来动态增加字体
     ArrayList list = new ArrayList();
     //获取系统数组的列表中集合的长度
     int count = ff.Length;
     //使用for循环把字体名称写入到“字体”控件中
     for (int i = 0; i < count; i++)
     {
         string FontName = ff[i].Name;
         //将系统的字体添加到字体控件的集合里面
         字体控件.Items.Add(FontName);
     }
 }

2.加粗模块

private void 加粗_Click(object sender, EventArgs e)
{
    //点击按钮加粗,加粗时再点击按钮取消加粗,此间保持倾斜不变
    if (文本框控件.Font.Bold == false)
    {
        if (文本框控件.Font.Italic == false)
            //只设置加粗,不倾斜
            文本框控件.Font = new Font(文本框控件.Font, FontStyle.Bold);
        else
            //加粗倾斜都设置
            文本框控件.Font = new Font(文本框控件.Font, FontStyle.Bold | FontStyle.Italic);
    }
    else
    {
        //加粗倾斜都不设置
        if (文本框控件.Font.Italic == false)
            文本框控件.Font = new Font(文本框控件.Font, FontStyle.Regular);
        else
            //只设置倾斜
            文本框控件.Font = new Font(文本框控件.Font,  FontStyle.Italic);
    }
}

3.倾斜模块(这里和加粗模块大同小异)

private void 倾斜_Click(object sender, EventArgs e)
{
    //点击按钮倾斜,倾斜时再点击按钮取消倾斜,此间保持加粗不变
    if (文本框控件.Font.Italic == false)
    {
        if (文本框控件.Font.Bold == false)
            //只设置倾斜,不加粗
            文本框控件.Font = new Font(文本框控件.Font, FontStyle.Italic);
        else
            //加粗倾斜都设置
            文本框控件.Font = new Font(文本框控件.Font, FontStyle.Italic|FontStyle.Bold );
    }
    else
    {
        if (文本框控件.Font.Bold == false)
            //加粗倾斜都不设置
            文本框控件.Font = new Font(文本框控件.Font, FontStyle.Regular);
        else
            //只设置加粗
            文本框控件.Font = new Font(文本框控件.Font, FontStyle.Bold);
    }
}

4字体模块(通过下拉选择对应的字体)

//改变选择字体的索引事件
private void 字体_Click(object sender, EventArgs e)
{
    string fontName = 字体控件.Text;
    float fontSize = float.Parse(字号控件.Text);
    文本框控件.Font = new Font(fontName, fontSize);
    //文本框控件.Font = new Font(字体控件.Text, float.Parse(字号控件.Text));
}

5字号模块

 // 改变选择字号的索引事件
 private void 字号控件_Click(object sender, EventArgs e)
 {
     string fontName = 字体控件.Text;
     float fontSize = float.Parse(字号控件.Text);
     文本框控件.Font = new Font(fontName, fontSize);
     //文本框控件.Font = new Font(字体控件.Text, float.Parse(字号控件.Text));
 }

6手动修改字号模块(因为这里是手动添加了部分字号大小,不能囊括全部)

//手动改变字体的大小
private void 字号控件_TextChanged(object sender, EventArgs e)
{
    string fontName = 字体控件.Text;
    float fontSize = float.Parse(字号控件.Text);
    文本框控件.Font = new Font(fontName, fontSize);
    //文本框控件.Font = new Font(字体控件.Text, float.Parse(字号控件.Text));
}

7保存模块(这里需细细品味缘由)

//保存文档
private void 保存控件_Click(object sender, EventArgs e)
{
    //文本框不为空才进行保存,忽略空格
    if (文本框控件.Text.Trim() != "")
    {
        if (Text == "")
        {
            //创建一个过滤器用来保存txt文档
            saveFileDialog1.Filter = ("文本文档(*.txt)|*.txt");
            //判断用户点击的保存按钮还是取消按钮
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //获取用户选择的文件以及路径
                string path = saveFileDialog1.FileName;
                //保存文件到用户指定路径
                StreamWriter sw = new StreamWriter(path, false);
                sw.WriteLine(文本框控件.Text.Trim());
                //把窗体的text属性设置为保存后的文件路径
                Text = path;
                //清理缓存,释放资源
                sw.Flush();
                sw.Close();
            }
        }
        else
        {
            //获取用户选择的文件以及路径并保存到指定位置
            string path = Text;
            //创建一个对象保存文件到指定路径
            StreamWriter sw = new StreamWriter(path,false);
            //将文本框里面的文档(忽略空格)写到sw对象中
            sw.WriteLine(文本框控件.Text.Trim());
            //清理缓存,释放资源
            sw.Flush();
            sw.Close();
        }
    }
    else
    {
        MessageBox.Show("空文档不能保存", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

8.文本框编辑事件

//文本框控件
private void 文本框控件_TextChanged(object sender, EventArgs e)
{
    //修改文本框时将toolStripLabel1.Text的属性改为“*”
    toolStripLabel1.Text = "*";
}

9窗体关闭事件

//窗体关闭事件
private void 子窗体_FormClosing(object sender, FormClosingEventArgs e)
{
    //判断记号label是否是*号
    if (toolStripLabel1.Text == "*")
    {
        //如果是*号进入代码,提示用户尚未保存
        DialogResult dr = MessageBox.Show("文档尚未保存,确定要继续退出吗?", "信息询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        //如果用户选择是 确定 按钮
        if (dr == DialogResult.Yes)
        {
            Dispose();
        }
        else
        {
            e.Cancel = true;
        }
    }
}

10新建事件

//新建事件
private void 新建_Click(object sender, EventArgs e)
{
    文本框控件.Text = "";
    toolStripLabel1.Text = "";
    Text = "";
}

至此,子窗体的功能已经实现了记事本的基本功能,父窗体此时尚未编辑,编译启动程序后,在bin的Debug文件里生成的NotePad.exe应用程序可以独立打开运行了,至此完成了简易记事本的一些功能,后续功能大家也可以尝试自由发挥,同时也欢迎大家对文章进行批评指正,促使我们一起学习,共同进步。

四、常见问题汇总

这里我列出来两个初用C#窗体时需要知道的一些知识。
①运行C#窗体代码会发现生成的窗体字的分辨率不高,解决办法如下:
先在项目中添加一个类。
在项目中添加一个类
选中应用程序清单文件,直接添加文件。
选中应用程序清单文件,直接添加文件
找到如下一段代码,将注释去掉即可。

 <!--
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
      <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
    </windowsSettings>
  </application>
  -->

修改后运行的窗体代码如下:
修改后运行的窗体代码
②如果有的控件不需要设计代码,但又双击点开了,这里我们这里直接删除代码会无法查看设计器,此时只需在设计器里面点击“转到代码”,进去将标红的语句(刚才双击控件生成的代码)删除即可。

总结

本文实现了一个简易记事本的功能,方便初学者熟悉winform的基本用法,为后续学习打下一定的基础,源代码文件可以在本人资源里面下载。

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

37方寸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值