用C#实现记事本功能

文章目录

一、功能要求
二、记事本界面设计
1、创建项目
(1)新建项目
(2)修改窗体属性
2、页面设计
(1)菜单控件 MenuStrip
(2)工具栏控件ToolStrip
(3)多格式文本框控件 RichTextBox
(4)状态栏控件 StatusStrip
(5)对话框
三、编写代码
1、 窗体代码
2、 多格式文本框代码
3、 菜单代码
(1)【文件(F)】菜单
(2)【编辑(E)】菜单
(3)【格式(O)】菜单
(4)【查看(V)】菜单
(5)【帮助(H)】菜单
4、工具栏代码
5、计时器代码
6、窗体代码
四、效果图
五、总结
六、gitee仓库地址

一、功能要求

记事本程序具有文件的新建、打开、保存功能;文字的复制、粘贴、删除功能;字体类型、格式的设置功能;查看日期时间等功能,并且用户可以根据需要显示或者隐藏工具栏和状态栏。

 

 

二、记事本界面设计

1.创建项目

(1)新建项目

选择  模版 → Visual C# → windows→ windows窗体应用程序 在下面的名称写Notepad 

(2)修改窗体属性

2.界面设计

新建好“Notepad”项目后,定位到记事本程序的窗体设计器窗口,然后依次在窗体上放置以下控件(1)MenuStrip(菜单控件)

 单击窗体左边会出现工具箱→ 找到menustrip →拖动到窗体中。单击菜单栏→右下角属性→修改Name属性为“mnusNotepad”


 

 依次单击 输入【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】

 根据下列列表修改各项属性

 

 

 菜单界面搭建完成。

(2)工具栏控件ToolStrip

单击窗体左边会出现工具箱→ 找到“ToolStrip” →拖动到窗体中 单击工具栏→右下角属性→修改Name属性为“tlsNotepad”

右击工具栏→ 插入标准项,得结果如下图:

 不需要修改name属性,但是可以根据自己需要调整子项属性。

 (3)多格式文本框控件 RichTextBox

 单击窗体左边会出现工具箱→ 找到“RichTextBox” →拖动到窗体中 单击工具栏→右下角属性→修改Name属性为“rtxtNotepad”。Anchor属性选择“Top,Bottom,Left,Right”,这样当窗体大小改变时,RichTextBox控件的大小也会跟着改变,如图所示:

 (4)状态栏控件 StatusStrip

① 修改Name属性设为“stsNotepad”
② 将Anchor属性设为“Bottom,Left,Right”。然后单击右边的按钮

③ 下拉列表中保留默认的选择“StatusLabel”,然后单击【添加】按钮,依次添加2个StatusLabel,并分别命名为“tssLbl1”和“tssLbl2”,再将tssLbl1的Text属性设为“就绪”, tssLbl2的Text属性设为“显示日期、时间”。效果图:

 (5)对话框

 

① 打开对话框 OpenFileDialog

功能:
当用户单击记事本的【文件】→【打开】菜单项时,使用打开对话框OpenFileDialog打开文件。
控件设置:
Name属性为“odlgNotepad”,Filter属性设为“RTF文件|.rtf|所有文件|.*”。
② 保存对话框 SaveFileDialog

功能:
当用户单击记事本的【文件】→【保存】(或【另存为】)菜单项时,使用保存对话框SaveFileDialog保存文件。
控件设置
Name属性为“sdlgNotepad”,FileName属性改为“无标题”,Filter属性设为“RTF文件”
③ 字体对话框 FontDialog

功能:
当用户单击记事本的【格式】→【字体】菜单项时,使用字体对话框FontDialog设置文本字体。
控件设置:
Name属性为“fdlgNotepad”。
④ 计时器控件 Timer

功能:
状态栏中显示了时钟,这就需要使用一个Timer控件来实现。
属性设置:
Name属性设为“tmrNotepad”,Enabled(激活的可行的)属性设为“True”,Interval(间隔,间距,幕间时间)属性设为“1000”,表示1秒种触发一次Tick事件,即1秒钟改变一次时钟。

设置完之后全图:

 

三、编写代码

1、 窗体代码

双击窗体,进入代码区
代码的通用段声明以下两个公共变量,均为布尔型,“b”用于判断文件是新建的还是从磁盘打开的,“s”用于判断文件是否被保存。

    public partial class frmNotepad : Form
    {
        //*************************************************************************
        /* 布尔变量b用于判断文件是新建的还是从磁盘打开的,
           true表示文件是从磁盘打开的,false表示文件是新建的,默认值为false*/
        bool b = false;
        /* 布尔变量s用于判断文件件是否被保存,
           true表示文件是已经被保存了,false表示文件未被保存,默认值为true*/
        bool s = true;
        //*************************************************************************
        public frmNotepad()
        {
            InitializeComponent();
        }

 

2、 多格式文本框代码

当多格式文本框中的文本发生改变后,应当设置布尔变量“s”的值为false,表示文件未保存,因此编写多格式文本框的TextChanged事件代码如下:

private void rtxtNotepad_TextChanged(object sender, EventArgs e)
{
    // 文本被修改后,设置s为false,表示文件未保存
    s = false;
}

3、 菜单代码

(1)【文件(F)】菜单

  1. 【新建(N)】菜单项
    
    private void tsmiNew_Click(object sender, EventArgs e)
    {
        // 判断当前文件是否从磁盘打开,或者新建时文档不为空,并且文件未被保存
        if (b == true || rtxtNotepad.Text.Trim() != "")
        {
            // 若文件未保存
            if (s == false)
            {
                string result;
                result = MessageBox.Show("文件尚未保存,是否保存?", 
                    "保存文件", MessageBoxButtons.YesNoCancel).ToString();
                switch (result)
                {
                    case "Yes":
                        // 若文件是从磁盘打开的
                        if (b == true)
                        {
                            // 按文件打开的路径保存文件
                            rtxtNotepad.SaveFile(odlgNotepad.FileName);
                        }
                        // 若文件不是从磁盘打开的
                        else if (sdlgNotepad.ShowDialog() == DialogResult.OK)
                        {
                            rtxtNotepad.SaveFile(sdlgNotepad.FileName);
                        }
                        s = true;
                        rtxtNotepad.Text = "";
                        break;
                    case "No":
                        b = false;
                        rtxtNotepad.Text = "";
                        break;
                }
            }
        }
    }
    
     
  2. 【打开(O)】菜单项
    private void tsmiOpen_Click(object sender, EventArgs e)
    {
        if (b == true || rtxtNotepad.Text.Trim() != "")
        {
            if (s == false)
            {
                string result;
                result = MessageBox.Show("文件尚未保存,是否保存?", 
                    "保存文件", MessageBoxButtons.YesNoCancel).ToString();
                switch (result)
                {
                    case "Yes":
                        if (b == true)
                        {
                            rtxtNotepad.SaveFile(odlgNotepad.FileName);
                        }
                        else if (sdlgNotepad.ShowDialog() == DialogResult.OK)
                        {
                            rtxtNotepad.SaveFile(sdlgNotepad.FileName);
                        }
                        s = true;
                        break;
                    case "No":
                        b = false;
                        rtxtNotepad.Text = "";
                        break;
                }
            }
        }
        odlgNotepad.RestoreDirectory = true;
        if ((odlgNotepad.ShowDialog() == DialogResult.OK) && odlgNotepad.FileName != "")
        {
            rtxtNotepad.LoadFile(odlgNotepad.FileName);//打开代码语句
            b = true;
        }
        s = true;
    }
    
     

  3. 【保存(S)】菜单项

    private void tsmiSave_Click(object sender, EventArgs e)
    {
        // 若文件从磁盘打开并且修改了其内容
        if (b == true && rtxtNotepad.Modified == true)
        {
            rtxtNotepad.SaveFile(odlgNotepad.FileName);
            s = true;
        }
        else if (b == false && rtxtNotepad.Text.Trim() != "" &&
            sdlgNotepad.ShowDialog() == DialogResult.OK)
        {
            rtxtNotepad.SaveFile(sdlgNotepad.FileName);//保存语句
            s = true;
            b = true;
            odlgNotepad.FileName = sdlgNotepad.FileName;
        }
  4. 【另存为(A)】菜单项

    private void tsmiSaveAs_Click(object sender, EventArgs e)
    {
        if (sdlgNotepad.ShowDialog() == DialogResult.OK)
        {
            rtxtNotepad.SaveFile(sdlgNotepad.FileName);
            s = true;
        }
    }
    

    5.【退出(X)】菜单项

    private void tsmiClose_Click(object sender, EventArgs e)
    {
        Application.Exit();//程序结束
    }
    
    

    (2)【编辑(E)】菜单

    
     / 【撤销】菜单代码
    private void tsmiUndo_Click(object sender, EventArgs e)
    {
        rtxtNotepad.Undo();//撤销
    }
    
    // 【复制】菜单代码
    private void tsmiCopy_Click(object sender, EventArgs e)
    {
        rtxtNotepad.Copy();//复制
    }
    
    // 【剪切】菜单代码
    private void tsmiCut_Click(object sender, EventArgs e)
    {
        rtxtNotepad.Cut();//剪切
    }
    
    // 【粘贴】菜单代码
    private void tsmiPaste_Click(object sender, EventArgs e)
    {
        rtxtNotepad.Paste();//粘贴
    }
    
    // 【全选】菜单代码
    private void tsmiSelectAll_Click(object sender, EventArgs e)
    {
        rtxtNotepad.SelectAll();//全选
    }
    
    // 【日期】菜单代码
    private void tsmiDate_Click(object sender, EventArgs e)
    {
        rtxtNotepad.AppendText(System.DateTime.Now.ToString());//显示当前日期
    }
    
     

    (3)【格式(O)】菜单

    // 【自动换行】菜单项
    private void tsmiAuto_Click(object sender, EventArgs e)
    {
        if (tsmiAuto.Checked == false)
        {
            tsmiAuto.Checked = true;        	// 选中该菜单项
            rtxtNotepad.WordWrap = true;       	// 设置为自动换行
        }
        else
        {
            tsmiAuto.Checked = false;
            rtxtNotepad.WordWrap = false;
        }
    }
    
    //【字体(F)】菜单项
    private void tsmiFont_Click(object sender, EventArgs e)
    {
        fdlgNotepad.ShowColor = true;
        if (fdlgNotepad.ShowDialog() == DialogResult.OK)
        {
            rtxtNotepad.SelectionColor = fdlgNotepad.Color;
            rtxtNotepad.SelectionFont = fdlgNotepad.Font;
        }
    }
    
     

    (4)【查看(V)】菜单

    //  【工具栏(T)】菜单项
    private void tsmiToolStrip_Click(object sender, EventArgs e)
    {
        Point point;
        if (tsmiToolStrip.Checked == true)
        {
            // 隐藏工具栏时,把坐标设为(0,24),因为菜单的高度为24
            point = new Point(0, 24);
            tsmiToolStrip.Checked = false;
            tlsNotepad.Visible = false;
            // 设置多格式文本框左上角位置
            rtxtNotepad.Location = point;
            // 隐藏工具栏后,增加文本框高度
            rtxtNotepad.Height += tlsNotepad.Height;
        }
        else
        {
            /* 显示工具栏时,多格式文本框左上角位置的位置为(0,49),
               因为工具栏的高度为25,加上菜单的高度24后为49 */
            point = new Point(0, 49);
            tsmiToolStrip.Checked = true;
            tlsNotepad.Visible = true;
            rtxtNotepad.Location = point; 
            rtxtNotepad.Height -= tlsNotepad.Height;
        }
    }
    
    // 【状态栏(S)】菜单项
    private void tsmiStatusStrip_Click(object sender, EventArgs e)
    {
        if (tsmiStatusStrip.Checked == true)
        {
            tsmiStatusStrip.Checked = false;
            stsNotepad.Visible = false;
            rtxtNotepad.Height += stsNotepad.Height;
        }
        else
        {
            tsmiStatusStrip.Checked = true;
            stsNotepad.Visible = true;
            rtxtNotepad.Height -= stsNotepad.Height;
        }
    }
    

    (5)【帮助(H)】菜单

    
     // 【关于记事本(A)】菜单项
    private void tsmiAbout_Click(object sender, EventArgs e)
    {
        frmAbout ob_FrmAbout = new frmAbout();
        ob_FrmAbout.Show();
    }
    
     

    4、工具栏代码

    // 工具栏的ItemClicked事件代码
    private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        int n;
        // 变量n用来接收按下按钮的索引号从0开始
        n = toolStrip1_ItemClicked.Items.IndexOf(e.ClickedItem);
        switch (n)
        { 
            case 0:
                新建NToolStripButton_Click (sender, e);
                break;
            case 1:
                打开OToolStripButton_Click (sender, e);
                break;
            case 2:
                保存SToolStripButton_Click (sender, e);
                break;
            /*case 3:
                tsmiCopy_Click(sender, e);
                break;*/ // 我们不用case3
    
            case 4:
                剪切UToolStripButton_Click (sender, e);
                break;
            case 5:
                粘贴PToolStripButton_Click (sender, e);
                break;
            /*case 6:
                tsmiPaste_Click(sender, e);
                break; */ // 我们不用case6
            case 7:
                tsmiAbout_Click (sender, e);
                break;
        }
    }
    

    5、计时器代码

    
     // 计时器控件的Tick事件代码
    private void tmrNotepad_Tick(object sender, EventArgs e)
    {
        tssLbl2.Text = System.DateTime.Now.ToString();
    }
    

    6、窗体代码

    
     // 窗体的的SizeChanged事件代码
    private void frmNotepad_SizeChanged(object sender, EventArgs e)
    {
        frmNotepad ob_frmNotepad = new frmNotepad();
        tssLbl1.Width = this.Width / 2 - 12;
        tssLbl2.Width = tssLbl1.Width;
    }
    
     

    四、效果图

 

总结

在搭建过程中遇到了不少的问题,过程也比较繁琐,非常考验人的耐心,同时还有细心程度,大量的属性修改,函数编写非常的考验耐心细心。在客服了一些问题之后还是顺利完成了记事本的功能。

仓库地址:流星 (d-z-l-x) - Gitee.com


 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值