用c#实现记事本功能

本文档详细介绍了使用C#编程语言设计一个具备基本功能的记事本程序,包括新建、打开、保存文件,文本编辑操作如复制、粘贴、删除,字体设置,日期时间显示,以及自定义显示或隐藏工具栏和状态栏。通过控件设计、事件处理和代码编写,实现了完整的记事本应用,提供了清晰的界面设计步骤和代码实现细节。
摘要由CSDN通过智能技术生成

文章目录

一、功能要求

二、记事本界面设计

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.关于记事本

(1)页面设计

(2)代码

5.工具栏代码

6.计时器代码

7.窗体代码

四、效果图

五、总结

六、gitee仓库地址


一、功能要求

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

二、记事本界面设计

1.创建项目

(1)新建项目

打开VS,新建项目,选择windows窗体应用程序,命名为Notepad

(2)修改窗体属性

 

2.页面设计

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

(1)菜单控件 MenuStrip

①修改Name属性为"mnusNotepad"

②按下图所示依次单击 输入【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】(快捷键功能不用写进去,后续设置属性会自动显示)

 

③按下表依次设置对应属性

(2)工具栏控件ToolStrip

① 修改Name属性为“tlsNotepad”


② 插入标准项 如下图

不需修改Name属性:

(3)多格式文本框控件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”用于判断文件是否被保存。

2.多格式文本框代码

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

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 打开OCtrlOToolStripMenuItem_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)
        {
            //由于这个没有改Name属性,所以和图片不太一样,对照就行
            // 若文件从磁盘打开并且修改了其内容
            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.关于记事本

(1)页面设计

① 新添加【添加Windows窗体】菜单项,添加一个名为“frmAbout”的窗体
② 给窗体“frmAbout”添加几个Label、Button、LinkLabel和PictrueBox控件
③ 按下图信息设置好属性

结果:

(2)代码

// 【确定】按钮
private void btnOk_Click(object sender, EventArgs e)
{
    this.Close();
}

// 使用LinkLabel打开邮件或者网页
private void llblEmail_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
   System.Diagnostics.Process.Start(“http://www.baidu.com”);
}

5.工具栏代码

// 工具栏的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;
    }
}

6.计时器代码

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

7.窗体代码

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

四、效果图

五、总结

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

②实验过程中我进一步掌握了MenuStrip(菜单)、ToolStrip(工具栏)、RichTextBox(高级文本框)和StatusStrip(状态栏控件)等控件的使用,以及如何使用CommonDialog(公共对话框)实现对文本的存取、格式设置等操作。

③实验过程进行的还比较顺利,根据实验要求一步一步地进行控件设置和代码编写、调试,不断地尝试便能成功运行。

六、gitee仓库地址

gitee仓库源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值