【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)

实验目的

  综合应用C#MDI窗体设计方法,掌握各控件设计方法,MenuStripContextMenuStripToolStripStatusStrip等,以及文件管理操作等。

实验内容

  设计一个多文档界面的Windows应用程序,能够实现对文档的简单处理,包括:打开、关闭、保存文件,复制、剪切、粘贴、撤销等文本处理功能,同时能实现打印。

实验代码下载:

下图压缩包中的是我自己写的程序源代码,点击此处下载

还有一份是同学的,点击此处下载

实验方案

1、新建一个Windows窗体应用,文件名:窗体和控件综合设计;

2、分析:根据实验要求,首先需要创建一个父窗体,父窗体包含对富文本编辑的相关功能菜单,然后子窗体是富文本输入编辑框(关于父窗体与子窗体可参考此处),其中还需要实现查找与替换功能,所以需要设计这三个主要的界面。

相关界面设计如下:

父窗体设计:
Name:FormBack;属性IsMdiContainer设置为“True”。其他见下图:

富文本编辑窗体设计:
窗口名称为:FormRichText;富文本(RichText)编辑界面名称使用默认名称(richTextBox1),属性Dock值设置为:Fill(铺满窗口),属性Modifiers值设置为:Public。其他见下图:

查找与替换界面设计:
 窗口Name:FormFind,属性“TopMost”设置为“true”;
“向上”单选框Name:radioUp;
“向下”单选框Name:radioDown,属性值“Checked”设置为“True”(即初始状态为向下查找);
“区分大小写”勾选框Name:checkCase。其他按钮默认值。详情见下图:

实验代码:

1、FormBack.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 窗体和控件综合设计
{
    public partial class FormBack : Form
    {
        public FormBack()
        {
            InitializeComponent();
        }

        int documentCount = 1;                          //文档计数

        public FormRichText formRichText;               //定义编辑窗体变量

        //新建txt文件按钮:
        private void 新建NCtrlNToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NewFile();  //程序实现代码在后边
        }

        //打开txt文件按钮
        private void 打开OCtrlOToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFile();//程序实现代码在后边
        }

        //保存txt文件
        private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (documentCount != 1)
                Save();  //程序实现代码在后边
        }

        //另存为txt文件
        private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveAs();
        }

        private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void 撤销UCtrlZToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
            formRichText.richTextBox1.Undo();
        }

        private void 剪切TCtrlXToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
            formRichText.richTextBox1.Cut();
        }

        private void 复制CCtrlCToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
            formRichText.richTextBox1.Copy();
        }

        private void 粘贴PCtrlVToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
            formRichText.richTextBox1.Paste();
        }

        private void 删除LDelToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
            if (formRichText.richTextBox1.SelectedText.Length > 0)
            {
                formRichText.richTextBox1.SelectedText = "";
            }
        }

        //新建文档
        private void NewFile()
        {
            formRichText = new FormRichText();
            formRichText.MdiParent = this;//设置子窗体的父文档
            formRichText.Text = "文档" + documentCount++;//文档号
            formRichText.Show();//显示子窗体
            formRichText.isSaved = false;
        }

        //打开文件
        private void OpenFile()
        {
            string str;
            formRichText = new FormRichText();//实例化子窗体对象
            formRichText.MdiParent = this;        //设置子窗体的父文档为当前主窗体
            //设置打开文件对话框要打开的文件类型的初始值
            openFileDialog1.Filter = "文本文件 (*.txt) |*.txt|富文本  (*.rtf)|*.rtf|全部文件 (*.*)|*.*";//设置打开文件对话框要打开的文件类型                                                                                      
            if (openFileDialog1.ShowDialog() != DialogResult.Cancel)
            {
                str = openFileDialog1.FileName;//读打开文件的文件名
                formRichText.Text = str;//文件的文件名显示在窗体的标题
                MessageBox.Show(str + "打开成功!");
                formRichText.Show();//显示子窗体
                formRichText.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
                formRichText.isSaved = true;
                //formRichText.richTextBox1.LoadFile(@str, RichTextBoxStreamType.RichText);            //通过富文本框的LoadFile 方法,将打开的文件内容读出并显示在富文本框中
            }
        }

        //保存文件
        private void Save()
        {
            String str;
            FormRichText formRichText = (FormRichText)this.ActiveMdiChild;

            //如果文档未改动过,返回
            if (!formRichText.isChanged)
            {
                MessageBox.Show("文本内容未发生改变!");
                return;
            }

            //如果文档保存过(也就是不需要另存为)
            if (formRichText.isSaved)
            {
                formRichText = (FormRichText)this.ActiveMdiChild;       //获取当前窗口
                str = formRichText.Text.Trim();
                formRichText.richTextBox1.SaveFile(str, RichTextBoxStreamType.PlainText);
                formRichText.isChanged = false;
            }
            //否则,另存为
            else
            {
                SaveAs();
            }           
        }

        //另存为
        private void SaveAs()
        {
            string str;
            formRichText = (FormRichText)this.ActiveMdiChild;
            saveFileDialog1.DefaultExt = "txt";
            saveFileDialog1.Filter = "文本文件 (*.txt)|*.txt|全部文件 (*.*)|*.*";


            if (saveFileDialog1.ShowDialog(this) == DialogResult.OK)
            {
                str = saveFileDialog1.FileName;

                MessageBox.Show(str);

                if (str != "")
                {
                    formRichText.richTextBox1.SaveFile(str, RichTextBoxStreamType.PlainText);
                    formRichText.isSaved = true;
                    formRichText.isChanged = false;
                }
                else
                {
                    MessageBox.Show("请输入文件名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }

        private void 字体ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            formRichText = (FormRichText)this.ActiveMdiChild;
            FontDialog fontDialog = new FontDialog();
            if (fontDialog.ShowDialog() != DialogResult.Cancel)
            {
                formRichText.richTextBox1.SelectionFont = fontDialog.Font;//将当前选定的文字改变字体
            }
        }

        private void 字体颜色CToolStripMenuItem_Click(object sender, EventArgs e)
        {
            formRichText = (FormRichText)this.ActiveMdiChild;
            ColorDialog colorDialog = new ColorDialog();
            if (colorDialog.ShowDialog() != DialogResult.Cancel)
            {
                formRichText.richTextBox1.SelectionColor = colorDialog.Color;//将当前选定的文字改变字体
            }

        }


        private void 查找FCtrlFToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //FindPosition = 0;
            formRichText = (FormRichText)this.ActiveMdiChild;
            FormFind formFind = new FormFind(formRichText);
            formFind.Show();
        }

        private void 替换RCtrlHToolStripMenuItem_Click(object sender, EventArgs e)
        {
            formRichText = (FormRichText)this.ActiveMdiChild;
            FormFind formFind = new FormFind(formRichText);
            formFind.Show();
        }

        private void 帮助HToolStripMenuItem_Click(object sender, EventArgs e)
        {
            About about = new About();
            about.Show();
        }

        private void 层叠ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.Cascade);
        }

        private void 水平平铺ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileHorizontal);
        }

        private void 垂直平铺ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileVertical);
        }

        private void 全选ACtrlAToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
            formRichText.richTextBox1.SelectAll();
        }      

        private void FormBack_Load(object sender, EventArgs e)
        {

        }
    }
}

2、FormRichText.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 窗体和控件综合设计
{
    public partial class FormRichText : Form
    {
        public bool isChanged = true;
        public bool isSaved ;                           //文档是否被保存过

        public FormRichText()
        {
            InitializeComponent();
        }

        public Font SelectionFont { get; internal set; }

        internal void SaveFile(string fileName, RichTextBoxStreamType plainText)
        {
            throw new NotImplementedException();
        }

        private void FormRichText_Load(object sender, EventArgs e)
        {

        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            isChanged = true;
        }
    }
}

3、FormFind.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace 窗体和控件综合设计
{
    public partial class FormFind : Form
    {
        FormRichText parentForm; //定义包含富文本框的窗体变量
        private String strSearch = ""; // 表示要查找的字符串
        private String strReplace = "";// 表示要替换成的字符串
        private int searchPos = 0, lastSearchPos = 0;// 前者表示当前的查找位置,后者表示记录上次的查找位置
        private bool find;

        public FormFind(FormRichText parent)
        {
            this.parentForm = parent;
            InitializeComponent();           
        }

        private void FormFind_Load(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            SearchText();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ReplaceText();
            
        }
       
        private bool SearchText()
        {
            strSearch = findText.Text;//查找的文本
            strReplace = replaceText.Text;//替换的文本

            if (checkCase.Checked)// 表示区分大小写查找
            {
                if (radioDown.Checked) // 表示向下查找
                {
                    searchPos = parentForm.richTextBox1.Find(strSearch,  searchPos,  parentForm.richTextBox1.Text.Length, RichTextBoxFinds.MatchCase);
                }
                else// 表示向上查找
                {
                    this.searchPos = this.parentForm.richTextBox1.Find(this.strSearch, 0,searchPos, RichTextBoxFinds.MatchCase | RichTextBoxFinds.Reverse);
                }
            }
            else// 不区分大小写进行查找
            {
                if (this.radioDown.Checked)// 表示向下查找
                {
                    this.searchPos = this.parentForm.richTextBox1.Find(this.strSearch, searchPos,this.parentForm.richTextBox1.Text.Length,RichTextBoxFinds.None);
                }
                else// 表示向上查找
                {
                    this.searchPos = this.parentForm.richTextBox1.Find(this.strSearch, 0,searchPos, RichTextBoxFinds.Reverse);
                }
            }


            if (this.searchPos < 0)//如果未找到
            {
               // if (ShowNotFind)//如果要提示未找到信息
               // {
                //    MessageBox.Show("指定的文本未找到", "字处理", MessageBoxButtons.OK,
               //     MessageBoxIcon.Information);
               // }
                this.searchPos = this.lastSearchPos;
                //回到上次查找位置
                find = false;//表示未找到
            }
            else//找到文本
            {
                if (this.radioDown.Checked)
                //如果是向下查找,设置新的查找位置,继续向下查找
                {
                    this.searchPos += this.strSearch.Length;
                    //新的查找位置是本次开始的查找位置加上查找到文本的长度
                }
                else//如果是向上查找,设置新的查找位置,继续向前查找
                {
                    this.searchPos -= this.strSearch.Length;
                }
               // this.parentForm.Focus();// 使主窗体获得焦点
            }
            this.lastSearchPos = this.searchPos;
            //开始查找,把查找位置保存
            return find;           
        }

        private void ReplaceText()
        {
            this.strSearch = this.findText.Text;//查找的文本
            this.strReplace = this.replaceText.Text;//替换的文本
            if (!SearchText())//调用查找方法查找是否存在
            {
                if (this.parentForm.richTextBox1.SelectedText.Length > 0)
                {
                    //如果找到,则进行替换
                    this.parentForm.richTextBox1.SelectedText = this.strReplace;
                }
            }
        }
    }
}

运行参考结果:

至此,项目还有很多不足之处。

  • 17
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
可视化编程实验4: c 实验4:c是一种新型的可视化编程语言,它与其他编程语言不同之处在于它使用图表来表示代码逻辑。c的主要目标是通过可视化编程的方式让初学者更容易理解和编写代码。 在实验4:c中,我们将学习如何使用c语言来解决实际问题。例如,我们可以使用c语言编写一个计算器应用程序,它可以进行基本的数学运算,如加法、减法、乘法和除法。通过使用c语言的图表表示方法,我们可以更直观地看到代码的逻辑。 在编写c程序时,我们首先需要定义输入和输出。输入是指我们程序中需要获取的数据,而输出是指我们程序中将要产生的结果。在实验4:c中,我们可以使用图表的输入输出节点来表示输入和输出。比如,在计算器应用程序中,我们可以使用一个输入节点来接收用户输入的数字,然后使用一个输出节点来显示计算结果。 另一个关键的概念是使用图表的各种节点来表示代码的逻辑。在实验4:c中,我们可以使用图表中的条件节点来表示条件语句,使用循环节点来表示循环语句,使用函数节点来表示函数调用等等。通过使用这些节点,我们可以更清楚地看到代码的执行流程。 实验4:c还包括一些高级特性,如使用变量和数组来存储数据,使用自定义函数来组织代码等等。这些特性使得c语言更强大和灵活,可以应用于更复杂的问题。 总而言之,实验4:c是一种新颖的可视化编程语言,它以图表的形式展现代码逻辑,使初学者更易理解和编写代码。通过实验4:c,我们可以学习到编程的基本概念和技巧,为今后更深入地学习编程打下基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拾年之璐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值