写字板(Windows程序设计)

写字板(Windows程序设计)前言c正编译生成debug,exe等文件,同样也可以通过exe"反编译"生成相对应的文件,一劳永逸,任君选择(`・ω・´)(~~我们老师为了给我们看要求效果给了

大家好,又见面了,我是你们的朋友全栈君。

前言

c# 正编译生成debug,exe等文件,同样也可以通过exe反编译生成相对应的文件,一劳永逸,任君选择(`・ω・´) (我们老师为了给我们看要求效果给了我们一个半成品exe,cv工程师上线了,真为所欲为

问题描述

验证简易相册程序的实现(不需要写入报告)

设计一个类似Windows写字板的程序,使其具有以下功能:

  • 提供基本的写字板功能,如文件的打开,保存,支持txt、rtf;
  • 实现多格式的文本的编辑、修饰等,均有相应的菜单来控制,常用的菜单项配备相应的工具栏按钮(可参照Windows自带的写字板)
    按需添加其他的代码,如窗口的布局等;
  • 实现自定义的查找对话框,有能力的同学可进一步实现替换/全文替换等功能
  • 状态栏中显示学生学号、姓名等信息,在窗口的标题中显示当前正在编辑的文件名
  • (可选)其他你觉得实用的功能:如支持word等
  • (可选)将其改造成MDI程序:父窗口中包含新建、窗口、帮助等菜单;在运行时,子窗口的菜单会与其合并,合理设置各菜单项的MergeIndex/MergeAction属性,使其符合我们的使用习惯;编程允许用户调整各自窗口间的布局关系(平铺、层叠等)等
    先看效果
    image.png

解决方法

richtextbox

用richtextbox是一个类似写字板的一个控件,能满足rtf,txt等格式,如果要满足doc文档,去百度Microsoft.Office.Interop.Word.dll,下载并引用,打开保存代码如下(其中saveName为文件名)


        /// <summary>
        /// 打开文档操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFileDialog1.InitialDirectory = "C:\\";
            openFileDialog1.Filter = "rtf 文件|*.rtf|txt 文件|*.txt|doc files|*.doc";
            if (openFileDialog1.ShowDialog() != DialogResult.OK)
                return;
            saveName = openFileDialog1.FileName;
            if (openFileDialog1.FilterIndex == 1)
                richTextBox1.LoadFile(saveName);
            else if (openFileDialog1.FilterIndex == 2)
                richTextBox1.LoadFile(saveName, RichTextBoxStreamType.PlainText);
            else
                OpenWord(saveName);
            Text = saveName;
        }
        public void 父窗体打开Open(WritingBoard writingBoard)
        {
            writingBoard.openFileDialog1.InitialDirectory = "C:\\";
            writingBoard.openFileDialog1.Filter = "rtf 文件|*.rtf|txt 文件|*.txt|doc files|*.doc";
            if (writingBoard.openFileDialog1.ShowDialog() != DialogResult.OK)
                return;
            saveName = writingBoard.openFileDialog1.FileName;
            if (writingBoard.openFileDialog1.FilterIndex == 1)
                writingBoard.richTextBox1.LoadFile(saveName);
            else if (writingBoard.openFileDialog1.FilterIndex == 2)
                writingBoard.richTextBox1.LoadFile(saveName, RichTextBoxStreamType.PlainText);
            else
                OpenWord(saveName);
            writingBoard.Text = saveName;
            return;
        }
        public void OpenWord(string fileName)
        {
            ApplicationClass applicationClass = new ApplicationClass();
            Document document = null;
            object obj = Missing.Value;
            object FileName = fileName;
            object ReadOnly = false;
            object Visible = true;
            try
            {
                document = applicationClass.Documents.Open(ref FileName, ref obj, ref ReadOnly, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref Visible, ref obj, ref obj, ref obj, ref obj);
                document.ActiveWindow.Selection.WholeStory();
                document.ActiveWindow.Selection.Copy();
                richTextBox1.Paste();
            }
            finally
            {
                document?.Close(ref obj, ref obj, ref obj);
                applicationClass?.Quit(ref obj, ref obj, ref obj);
            }
        }
        /// <summary>
        /// 保存操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (saveName != "")
            {
                richTextBox1.SaveFile(saveName, RichTextBoxStreamType.RichText);
            }
            else
            {
                saveFileDialog1.Filter = "rtf files|*.rtf";
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    saveName = saveFileDialog1.FileName;
                    richTextBox1.SaveFile(saveName, RichTextBoxStreamType.RichText);
                }
            }
        }
        /// <summary>
        /// 另存为操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)
        {
            saveFileDialog1.FileName = saveName.Substring(saveName.LastIndexOf('\\') + 1);
            saveFileDialog1.Filter = "rtf files|*.rtf|txt files|*.txt|doc files|*.doc";
            saveFileDialog1.AddExtension = true;
            if (saveFileDialog1.ShowDialog() != DialogResult.OK)
                return;
            saveName = saveFileDialog1.FileName;
            if (saveFileDialog1.FilterIndex == 1)
                richTextBox1.SaveFile(saveName, RichTextBoxStreamType.RichText);
            else if (saveFileDialog1.FilterIndex == 2)
                richTextBox1.SaveFile(saveName, RichTextBoxStreamType.PlainText);
            else
                SaveAsWord(saveName);
        }
        public void SaveAsWord(string fileName)
        {
            ApplicationClass applicationClass = new ApplicationClass();
            Document document = null;
            object obj = Missing.Value;
            object FileName = fileName;
            try
            {
                document = applicationClass.Documents.Add(ref obj, ref obj, ref obj, ref obj);
                document.ActiveWindow.Selection.WholeStory();
                richTextBox1.SelectAll();
                Clipboard.SetData(DataFormats.Rtf, richTextBox1.SelectedRtf);
                document.ActiveWindow.Selection.Paste();
                document.SaveAs(ref FileName, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj);
            }
            finally
            {
                document?.Close(ref obj, ref obj, ref obj);
                applicationClass?.Quit(ref obj, ref obj, ref obj);
            }
        }
        /// <summary>
        /// 新建操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 新建NToolStripMenuItem_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();
            saveName = "";
        }

写字板操作设置

其他一系列doc加粗,倾斜,下划线,左中右对齐,字体型号颜色,查找(大小写,全字,正逆),其实本质上来说都是对richtextbox的一些属性的修改,注意多用DropDownOpening,DropDownItemClicked等操作代替Click,使代码更加精简高效
   image.png

  这是一个MDI调整子窗体使用DropDownItemClicked的例子,高效优雅 = v =

private void 窗口WToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            string layout=e.ClickedItem.Text;
            switch(layout)
            {
                case "水平平铺": LayoutMdi(MdiLayout.TileHorizontal);break;
                case "垂直平铺": LayoutMdi(MdiLayout.TileVertical); break;
                case "层叠": LayoutMdi(MdiLayout.Cascade); break;
            }
        }

MDI的使用,是为了让一个父窗体拥有许多个子窗体,进行更加简单有效的操作

image.png
在父窗体new子窗体就行,记得一系列基本操作,你也可以通过生成函数和属性进行快速高效设置

private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            WritingBoard writingBoard = new WritingBoard();
            writingBoard.TopLevel = false;
            writingBoard.MdiParent = this;
            writingBoard.Show();
        }

        private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            WritingBoard writingBoard = new WritingBoard();
            writingBoard.TopLevel = false;
            writingBoard.MdiParent = this;
            writingBoard.父窗体打开Open(writingBoard);
            writingBoard.Show();
        }

        private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (WritingBoard writingBoard in MdiChildren) writingBoard.Close();
            Application.Exit();
        }

        private void 窗口WToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            string layout=e.ClickedItem.Text;
            switch(layout)
            {
                case "水平平铺": LayoutMdi(MdiLayout.TileHorizontal);break;
                case "垂直平铺": LayoutMdi(MdiLayout.TileVertical); break;
                case "层叠": LayoutMdi(MdiLayout.Cascade); break;
            }
        }

源码附上

  传送门,我设置了分支,这样我就可以把不同内容相同属性的代码放在一起了,同时也可以拥有不同的md可以阅读,对于git 的整理也是不错的(`・ω・´)
image.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154565.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 架构设计:微服务模式下,实现灰度发布模式

    架构设计:微服务模式下,实现灰度发布模式

    2020年11月20日
    187
  • 谷歌地图 ftp_谷歌地图离线地图包

    谷歌地图 ftp_谷歌地图离线地图包1.3GB的谷歌离线地图包安装使用与下载:MapsV4.5.0以前的版本安装方法: 1、谷歌地图软件要下载经国外高手brut修改过的带brut字样的版本如Google.Maps.v4.4.0.4414-brut16.apk 2、将下载的谷歌离线地图包解压到SD卡根目录下的\brut.googlemaps文件夹中 3、打开地图软件,点菜单进更多,在高级设置里勾

    2022年9月14日
    0
  • java jvm 参数 -Xms -Xmx -Xmn -Xss 调优

    堆大小设置JVM中最大堆大小有三方面限制: 1.相关操作系统的数据模型(32-bt还是64-bit)限制;2.系统的可用虚拟内存限制;3.系统的可用物理内存限制.在32位系统下,一般限制在1.5G~2G;64为操作系统对内存无特定限制.  机器配置:128G内存  32核CPU典型设置: java-Xmx72g -Xms72-Xmn4g-Xss256m  -Xmx…

    2022年4月6日
    77
  • android之View和ViewGroup介绍

    资源描述: Activity(活动)中包含views(视图)和ViewGroups(视图组)。“视图”(View)就是显示在屏幕上的一个组件(Widget)。View的例子:按钮(Button)、标签(TextView)和文本框(EditText)。每个“视图”(View)都继承自基类android.view.View。“视图组”(ViewGroup)可以包含一个或多个

    2022年3月9日
    83
  • SAE J1939 协议源代码分析(二)-程序移植

    SAE J1939 协议源代码分析(二)-程序移植预备知识1.熟悉CAN2.0B协议,及相关硬件驱动开发2.熟悉SAEJ1939协议程序移植流程CreatedwithRaphaël2.1.0将代码加载到你的工程打开配置文件J1939_Config.h明白默认地址和标识符配置规则?了解J1939支持的功能配置使用

    2022年6月10日
    31
  • 嵌入式软件工程师待遇怎么样

    嵌入式软件工程师待遇怎么样本来大家选择嵌入式也就是冲着嵌入式的发展前景不错而来,所以在嵌入式这块还是有很多不知道的知识,这些也都要等着老师去给你讲解了,下面先来了解下嵌入式软件工程师待遇怎么样吧。嵌入式软件工程师待遇怎么样:1、应届毕业生如果你是在一线城市的话,有人带你,你自己有比较学的好,那么你的薪资待遇就可以达到6k+,但是不同公司不同待遇,而且不同地区不同的薪资待遇,就像北上广,这些地区薪资待遇是比其他地区高出2k以上,甚至更高的。就像人家阿里,那工资肯定就比其他公司要高的多。所以得看你要去什么地方发展了,但是平均

    2022年9月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号