windows第三次作业—记事本

一、介绍说明

1.1文章介绍

    本篇文章介绍如何使用Visual C#设计一个Windows应用程序——记事本,通过本章的学习,可以进一步掌握MenuStrip(菜单)、ToolStrip(工具栏)、RichTextBox(高级文本框)和StatusStrip(状态栏控件)等控件的使用,以及如何使用CommonDialog(公共对话框)实现对文本的存取、格式设置等操作。

1.2记事本介绍

     记事本是一种常用的软件,在微软的Windows中,自带了一个记事本软件,本次介绍的记事本,实现了Windows自带的记事本的部分功能外,并且还可以任意更改字体的字体类型、大小和颜色,并在状态栏中显示时间。为了方便用户的操作,还在程序的窗体上放置了一个工具栏。

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

    接下来将详细的介绍记事本程序的设计与实现的步骤和方法。

目录

一、介绍说明

二、设计流程构造

(1)MenuStrip

2)ToolStrip

(3)RichTextBox

(4)StatusStrip

  (5)OpenFileDialog

(6)SaveFileDialog

(7)FontDialog

(8)Timer

三、关键源码展示

3.1多格式文本框代码(RichTextBox)

3.2菜单代码

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

1.【新建(N)】菜单项

2.【打开(O)】菜单项

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

4.【另存为(A)】菜单项

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

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

1.撤销

2.复制

 3.剪切

 4.粘贴

 5.全选

 6.日期

(2)关于记事本

3.3关于记事本

3.4工具栏代码

3.5计时器代码

3.6窗体代码

四、结果展示

五、总结

六、源码开源地址


界面设计

   打开visual studio2022,新建一个Windows窗体应用程序,并命名为“Notepad”。出现界面以后,单击窗体,更改窗体名称,将text属性修改为“记事本”。并将其Name属性修改为“frmNotepad”,将startposition属性修改为“CenterScreen”,并设置size属性为“600,450”。

    新建好Notepad项目后,依次在设计器窗口上放置:

(1)MenuStrip

修改Name属性为“mnusNotepad”,输入【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】,如图。

 并依次设置其属性窗口至如图所示。

2)ToolStrip

找到“ToolStrip” ,拖动到窗体中,单击工具栏,将右下角修改Name属性为“tlsNotepad”。

右击工具栏,插入标准项。

右击工具栏,编辑项,我们只设置几个简单的功能(新建,打开,保存,剪切,粘贴,复制)。其它我们不再设置。

(3)RichTextBox

找到“RichTextBox” 拖动到窗体中,单击工具栏 右下角修改Name属性为“rtxtNotepad”,Anchor属性选择“Top,Bottom,Left,Right”。

(4)StatusStrip

添加StatusStrip控件,将其Name属性设为“stsNotepad”,将Dock属性设为“Bottom”再将Anchor属性设为“Bottom,Left,Right”。然后单击items属性右边的按钮,打开【项集合编辑器】对话框。下拉列表中保留默认的选择“StatusLabel”,然后单击【添加】按钮,依次添加2个StatusLabel,并分别命名为“tssLbl1”和“tssLbl2”,再将tssLbl1的Text属性设为“就绪”, tssLbl2的Text属性设为“显示日期、时间”。

  (5)OpenFileDialog

从工具箱中找到OpenFileDialog直接拖入窗体中 单击属性。当用户单击记事本的【文件】→【打开】菜单项时,使用打开对话框OpenFileDialog打开文件。OpenFileDialog控件的Name属性为“odlgNotepad”,Filter属性设为“RTF文件|*.rtf|所有文件|*.*”。

(6)SaveFileDialog

从工具箱中找到SaveFileDialog直接拖入窗体中 单击属性。当用户单击记事本的【文件】→【保存】(或【另存为】)菜单项时,使用保存对话框SaveFileDialog保存文件。SaveFileDialog控件的Name属性为“sdlgNotepad”,FileName属性改为“无标题”,Filter属性设为“RTF文件|*.rtf”。

(7)FontDialog

从工具箱中找到FontDialog直接拖入窗体中 单击属性。当用户单击记事本的【格式】→【字体】菜单项时,使用字体对话框FontDialog设置文本字体。FontDialog控件的Name属性为“fdlgNotepad”。

(8)Timer

从工具箱中找到Timer直接拖入窗体中 单击属性。Timer控件的Name属性设为“tmrNotepad”,Enabled(激活的可行的)属性设为“True”,Interval属性设为“1000”,表示1秒种触发一次Tick事件,即1秒钟改变一次时钟。

界面设计完毕,如图。

三、关键源码展示

首先双击窗体,进入代码区填写以下代码

//*************************************************************************

        /* 布尔变量b用于判断文件是新建的还是从磁盘打开的,

           true表示文件是从磁盘打开的,false表示文件是新建的,默认值为false*/

        bool b = false;

        /* 布尔变量s用于判断文件件是否被保存,

           true表示文件是已经被保存了,false表示文件未被保存,默认值为true*/

        bool s = true;

        //*************************************************************************

       

3.1多格式文本框代码(RichTextBox)

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

双击RichTextBox,进入代码区填写以下代码

// 多格式文本框的TextChanged事件代码

//*************************************************************************

private void rtxtNotepad_TextChanged(object sender, EventArgs e)

{

    // 文本被修改后,设置s为false,表示文件未保存

    s = false;

}

3.2菜单代码

(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)

{//由于这个没有改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)】菜单

1.撤销

private void tsmiUndo_Click(object sender, EventArgs e)

{

    rtxtNotepad.Undo();//撤销

}

2.复制

private void tsmiCopy_Click(object sender, EventArgs e)

{

    rtxtNotepad.Copy();//复制

}

 3.剪切

private void tsmiCut_Click(object sender, EventArgs e)

{

    rtxtNotepad.Cut();//剪切

}

 4.粘贴

private void tsmiPaste_Click(object sender, EventArgs e)

{

    rtxtNotepad.Paste();//粘贴

}

 5.全选

private void tsmiSelectAll_Click(object sender, EventArgs e)

{

    rtxtNotepad.SelectAll();//全选

}

 6.日期

private void tsmiDate_Click(object sender, EventArgs e)

{

    rtxtNotepad.AppendText(System.DateTime.Now.ToString());//显示当前日期

}

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

1.【自动换行(W)】菜单项

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;

    }

}

2.【字体(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)】菜单

1.【工具栏(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;

    }

}

2.【状态栏(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)】菜单

(2)关于记事本

private void tsmiAbout_Click(object sender, EventArgs e)

{

    frmAbout ob_FrmAbout = new frmAbout();

    ob_FrmAbout.Show();

}

3.3关于记事本

接下来单击Visual C# 2013的【项目】→【添加Windows窗体】菜单项,添加一个名为“frmAbout”的窗体,然后给窗体“frmAbout”添加几个Label、Button、LinkLabel和PictrueBox控件。

且button的Name属性为“btnOk”

双击“确定”按钮

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”);

}

3.4工具栏代码

双击工具栏

private void tlsNotepad_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

        {

            int n;

            // 变量n用来接收按下按钮的索引号从0开始

            n = tlsNotepad.Items.IndexOf(e.ClickedItem);

            switch (n)

            {

                case 0:

                    tsmiNew_Click(sender, e);

                    break;

                case 1:

                    tsmiOpen_Click(sender, e);

                    break;

                case 2:

                    tsmiSave_Click(sender, e);

                    break;

                /*case 3:

                    tsmiCopy_Click(sender, e);

                    break;*/ // 我们不用case3



                case 4:

                    tsmiCut_Click(sender, e);

                    break;

                case 5:

                    tsmiPaste_Click(sender, e);

                    break;

                /*case 6:

                    tsmiPaste_Click(sender, e);

                    break; */ // 我们不用case6

                case 7:

                    tsmiAbout_Click(sender, e);

                    break;



            }



        }

3.5计时器代码

private void tmrNotepad_Tick(object sender, EventArgs e)

{

    tssLbl2.Text = System.DateTime.Now.ToString();

}

3.6窗体代码

private void frmNotepad_SizeChanged(object sender, EventArgs e)

{

    frmNotepad ob_frmNotepad = new frmNotepad();

    tssLbl1.Width = this.Width / 2 - 12;

    tssLbl2.Width = tssLbl1.Width;

}

四、结果展示

 

五、总结

这次大作业学会了使用Visual C#设计一个Windows应用程序——记事本,熟悉了对各类控件的应用,根据老师发的文档进行设计,因为有教程难度还不算太大,这个实验是对过去学习的知识进行的一个复习过程,同时锻炼了我们的学习能力,让我们熟练的运用教程来学习,这次试验让我明白做事要有耐心,因为这个作业相对于以往的作业花费了更多的时间,同时也让我认识到了很多的不足,自己对c#还是不熟练,下来之后需要花更多的时间去弄。

六、源码开源地址

记事本地址:

记事本 · 降维打击/windows第三次作业(记事本) - Gitee.com

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值