(C#)Windows程序设计——使用Visual C#设计一个Windows应用程序记事本

产品介绍

记事本是一种常用的软件,在微软的Windows中,自带一个记事本软件,如图。

但电脑自带的记事本实际功能单一,所以我们来通过使用Visual C#实现了Windows自带的记事本的部分功能外,并且还可以任意更改字体的字体类型、大小和颜色,并在状态栏中显示时间。为了方便用户的操作,还在程序的窗体上放置了一个工具栏。

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

记事本界面设计

新建一个Windows窗体应用程序,并命名为“Notepad”。

打开VS2013 单击 文件→新建→项目→C# →  windows窗体应用程序

在名称写Notepad 

设置窗体属性

控件类型

控件名称

属性

设置结果

Form

Form1

Name

frmNotepad

Text

记事本

StartPosition(起始位置)

CenterScreen(中央屏幕)

Size

600, 450

界面设计

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

1)MenuStrip(菜单控件)

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

 并依次设置其属性窗口

Text属性

Name属性

ShortcutKeys属性

(快捷键)

ShowShortcutKeys属性

文件(&F)

tsmiFile

None

新建(&N)

tsmiNew

Ctrl+N

True

打开(&O)

tsmiOpen

Ctrl+O

True

保存(&S)

tsmiSave

Ctrl+S

True

另存为(&A)

tsmiSaveAs

None

分隔符(用“-”来分隔)

退出(&X)

tsmiClose

None

Text属性

Name属性

ShortcutKeys属性

ShowShortcutKeys属性

编辑(&E)

tsmiEdit

None

撤销(&U)

tsmiUndo

Ctrl+Z

True

分隔符

复制(&C)

tsmiCopy

Ctrl+C

True

剪切(&T)

tsmiCut

Ctrl+X

True

粘贴(&P)

tsmiPaste

Ctrl+V

True

分隔符

全选(&A)

tsmiSelectAll

Ctrl+A

True

日期(&D)

tsmiDate

F5

True

Text属性

Name属性

Check属性

格式(&O)

tsmiFormat

False

自动换行(&W)

tsmiAuto

True

字体(&F)

tsmiFont

False

Text属性

Name属性

Checked属性

查看(&V)

tsmiView

False

工具栏(&T)

tsmiToolStrip

True

状态栏(&S)

tsmiStatusStrip

True

Text属性

Name属性

帮助(&H)

tsmiHelp

关于记事本(&A)

tsmiAbout

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;

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

多格式文本框代码(RichTextBox)

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

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

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

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

private void rtxtNotepad_TextChanged(object sender, EventArgs e)

{

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

    s = false;

}

菜单代码

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

·【新建(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;

            }

        }

    }

}

·【打开(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;

}

·【保存(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;

    }

}

·【另存为(A)】菜单项

private void tsmiSaveAs_Click(object sender, EventArgs e)

{

    if (sdlgNotepad.ShowDialog() == DialogResult.OK)

    {

        rtxtNotepad.SaveFile(sdlgNotepad.FileName);

        s = true;

    }

}

·【退出(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)】菜单

·【自动换行(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;
    }
}

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

关于记事本

private void tsmiAbout_Click(object sender, EventArgs e)
{
    frmAbout ob_FrmAbout = new frmAbout();
    ob_FrmAbout.Show();
}

关于记事本

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

且button的Name属性为“btnOk”

控件类型

控件名称

属性

设置结果

Form

Form2

Name

frmAbout

Text

关于记事本

StartPosition

CenterScreen

MaximizeBox

False

AutoSizeMode

GrowAndShrink

Button

Button1

Name

btnOk

Text

确定

Label

Label1

Text

多功能记事本

LinkLabe

LinkLabel

Text

如有问题,点击这里

双击“确定”按钮

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

工具栏代码

双击工具栏

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;
            }
        }

计时器代码

private void tmrNotepad_Tick(object sender, EventArgs e)
{
    tssLbl2.Text = System.DateTime.Now.ToString();
}

窗体代码

private void frmNotepad_SizeChanged(object sender, EventArgs e)
{
    frmNotepad ob_frmNotepad = new frmNotepad();
    tssLbl1.Width = this.Width / 2 - 12;
    tssLbl2.Width = tssLbl1.Width;
}

心得体会

  1. 对于控件使用:在Windows应用程序的开发中,控件是不可避免的部分。如何使用不同的控件来实现不同的功能尤为重要。本次设计中采用了MenuStrip、ToolStrip、StatusStrip等控件的使用,以及使用CommonDialog实现对文本的存取、格式设置等操作。

  2. 对于布局设计:使用表格布局和流式布局来设计应用程序的界面,可以通过代码来实现更高级的布局设计。

  3. 处理用户交互:在应用程序中,处理用户交互是非常重要的。学会如何响应鼠标和键盘事件,以及如何处理用户的输入和选择,是设计一个好的应用程序的必要条件。

  4. 文件的操作:记事本是一个处理文本文件的应用程序,因此学会如何处理文件的打开、保存和读取等操作是非常重要的。能学习如何使用CommonDialog来实现文件的操作,并且通过代码来实现更高级的文件操作。

总的来说,设计一个Windows应用程序需要多方面的知识和技巧,包括控件的使用、布局的设计、用户交互的处理和文件的操作等。通过本次的设计,可以对Windows应用程序开发有更深入的认识和理解,提高编程能力和技巧。

源码开源地址

用C#语言实现记事本(代码)(期中作业) · 达达哒哒达达/Windows程序设计实验 - Gitee.com

### 回答1: 您好!以下是实现VBA代码,以显示Sheet1单元格内容在窗体文本框中: 首先,您需要在窗体上创建一个文本框。在窗体设计器中,双击工具箱中的“文本框”控件并将其拖动到窗体上。然后右键单击文本框,选择“属性”窗口。在属性窗口中,找到“名称”属性并为文本框命名,例如“TextBox1”。 接下来,打开VBA编辑器。可以通过按下Alt+F11键或在开发者选项卡中单击“Visual Basic”按钮来打开VBA编辑器。 在VBA编辑器中,选择窗体对象并打开其“代码”视图。在代码视图中,找到窗体的“Load”事件处理程序,并将以下代码添加到该处理程序中: Private Sub UserForm_Initialize() TextBox1.Value = Sheets("Sheet1").Range("A1").Value End Sub 在上面的代码中,我们将Sheet1单元格A1的值赋值给名为“TextBox1”的文本框的Value属性。您可以更改单元格引用以显示所需的单元格内容。 ### 回答2: VBA是Visual Basic for Applications的缩写,是一种用于编写宏的编程语言。实现窗体文本框显示Sheet1单元格的内容可以通过以下步骤来完成: 1. 首先,在VBA编辑器中,打开窗体的代码模块。 2. 在窗体的代码模块中,声明一个变量来保存Sheet1单元格的内容。例如,可以使用以下命令声明一个名为cellValue的字符串变量: Dim cellValue As String 3. 在窗体的代码模块中,使用以下命令将Sheet1单元格的内容赋值给变量cellValue: cellValue = Sheets("Sheet1").Range("A1").Value 这里假设需要显示Sheet1单元格A1的内容。 4. 在窗体的代码模块中,使用以下命令将变量cellValue的值传递给文本框的Text属性,使其显示在窗体上: TextBox1.Text = cellValue 这里假设窗体上的文本框的名称为TextBox1。 5. 最后,保存并关闭VBA编辑器。 通过以上步骤,窗体的文本框将显示Sheet1单元格内容。每当Sheet1单元格的内容发生改变时,文本框的内容也会相应地更新。 ### 回答3: VBA是Visual Basic for Applications的缩写,是一种用于自动化和自定义Microsoft Office应用程序的编程语言。VBA可以与Excel进行集成,通过编写代码来实现各种功能。 要实现窗体文本框显示Sheet1单元格内容,可以按照以下步骤进行: 1. 打开Excel,创建一个新的宏,点击“开发工具”选项卡,选择“Visual Basic”按钮,打开Visual Basic编辑器。 2. 在Visual Basic编辑器中,找到VBA project窗口中的VBA项目名称,右键点击,选择“插入”-“用户窗体”来创建一个新的用户窗体。 3. 在用户窗体上添加一个文本框控件,通过在工具箱中拖动放置到用户窗体上。可以调整文本框的大小和位置。 4. 双击文本框,进入文本框的事件处理程序。 5. 在文本框的事件处理程序中,编写以下VBA代码: Private Sub TextBox1_Change() Dim cellValue As Variant cellValue = ThisWorkbook.Sheets("Sheet1").Range("A1").Value TextBox1.Text = cellValue End Sub 这段代码的作用是在TextBox1的Change事件中,将Sheet1的A1单元格的值赋值给TextBox1的文本。 6. 在用户窗体中,右键点击用户窗体的名称,选择“显示代码”来打开代码窗口。在代码窗口中编写以下VBA代码: Private Sub UserForm_Initialize() Dim cellValue As Variant cellValue = ThisWorkbook.Sheets("Sheet1").Range("A1").Value TextBox1.Text = cellValue End Sub 这段代码的作用是在用户窗体初始化时,将Sheet1的A1单元格的值赋值给TextBox1的文本。 7. 验证代码的正确性后,点击“保存”并关闭Visual Basic编辑器。 8. 返回Excel,打开VBA编辑器,双击Sheet1,进入Sheet1的事件处理程序。 9. 在Sheet1的事件处理程序中,编写以下VBA代码: Private Sub Worksheet_Change(ByVal Target As Range) UserForm1.TextBox1.Text = Target.Value End Sub 这段代码的作用是当Sheet1单元格内容发生变化时,将变化的内容赋值给用户窗体中的TextBox1。 10. 最后,关闭VBA编辑器。现在,当你在Sheet1单元格中输入内容时,用户窗体中的文本框将显示Sheet1单元格的内容。 以上是使用VBA实现窗体文本框显示Sheet1单元格内容的步骤,你可以根据具体的需求进行适当的修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值