问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

多格式文本文件能不能用写字板打开和保存

发布网友 发布时间:2023-03-30 22:40

我来回答

1个回答

热心网友 时间:2023-11-06 14:58

登录
首页
学习
实践
活动
专区
工具
TVP
返回腾讯云官网
全栈程序员站长
55.1K 篇文章
关注
写字板(Windows程序设计)
2022-09-06 09:52:05阅读 1730
大家好,又见面了,我是你们的朋友全栈君。

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

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

解决方法
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,使代码更加精简高效

  这是一个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的使用,是为了让一个父窗体拥有许多个子窗体,进行更加简单有效的操作

在父窗体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 的整理也是不错的(`・ω・´)

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

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

本文分享自作者个人站点/博客
复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。

展开阅读全文
WindowshttpsJava网络安全
文章来自专栏
全栈程序员必看
55.1K 篇文章210 人关注
订阅
评论 (0)
写评论
暂无人发表评论

相关文章
《windows程序设计》_windows窗口程序设计
TEXTMETRIC类型的变量用于存储装置字体结构信息(上述变量),在窗口中输出文字时需要用到上述变量。

Windows程序设计——画圆[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170966.html原文链接:https://javaforall.cn

windows程序设计第五版_windows程序设计入门
函数功能:该函数用于画一个椭圆,椭圆的中心是限定矩形的中心,使用当前画笔画椭圆,用当前的画刷填充椭圆。

Windows程序设计学习笔记(一)Windows内存管理初步
学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流...

windows程序设计第五版_windows程序开发
[声明] HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor); [说明] 用指定的样式...

【读书笔记】Windows程序设计5
与从BeginPaint函数返回的设备句柄不同,从GetDC返回的设备句柄中的裁剪区域是整个客户区,而不仅仅

Windows程序设计:MFC 、Winform 和 WPF 比较[通俗易懂]
WinForm封装了win32的api,多次进行P/invoke操作(大部分使用p/invoke操作封装),速度慢。

Windows程序设计——窗口键盘消息滚动事件[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171006.html原文链接:https://javaforall.cn

什么是WPF_windows程序设计教程
(1)字参数(wParam) (2)长参数(lParam)   字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息的...

createfont函数_windows程序设计基于.net平台
cHeight是字体的高度。 cWidth是字体的宽度。 cEscapement是字体的倾斜角。 cOrientation是字体的倾斜角。 cWeigh...

Windows程序设计——LoadImage参数及其用法「建议收藏」
函数功能:该函数装载图标,光标,或位图。 函数原型: HANDLE LoadImage ( HINSTANCE hinst, LPCTSTR lpsz...

微信小程序写字板功能
windows文件在另一程序打开_windows程序设计第7版
参数可选值: SW_HIDE = 0; {隐藏, 并且任务栏也没有最小化图标} SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活} ...

windows程序设计第五版_程序设计中三种基本结构
WNDCLASS是一个由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等。也就是说,Cr...

用vb.net实现写字板程序报告(二)
用vb.net实现写字板程序报告(二) –by zigz(LuHai) luluhai@eastd
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 顺丰快递用微信营销取得成功的主要原因 身份证办理审核不通过是怎么回事 石家庄哪里有优贝儿童自行车专卖店 下载变声表示换行符的标签是 立秋后鸡不下蛋的原因,鸡蛋是从哪里出来的 立秋后可以吃鸡蛋会如何 看望病人礼金被退回咋办 老板生病了,员工发给老板的红包退回来了,应怎么处理 给主刀医生1千元钱闲少给退回来了,还能在给吗? 迷信上看望病人的红包能退吗 探望病人的慰问金退回去,怎么说感谢语 我想学做上海南翔的小笼包,请问哪里有学的?或者有谁有这方面技术的我可以跟他合作! 正宗上海南翔小笼包哪里有学 到哪里能学到正宗的制作小笼包子的手艺啊? 中专学的计算机应用技术单招大专能报动漫设计吗 计算机及应用和计算机动漫与游戏制作哪个好学?哪个前途比较好些 未分配利润过两年再分可以吗 存储过程指的是什么 河北工业大学电气工程考研经验分享? 大专毕业的酒店管理工作工资多少钱说重点 唉!中威金了大家想想办法啊 梦见耳朵快掉了还没有血的预兆 梦见自己把别人的耳朵割下来的预兆 太赫兹辐射的介绍? 太赫兹无损检测飞机隔热瓦原理 vivov51s可以连蓝牙耳机吗? vivov51s和苹果4那个好 如何调节电脑屏幕的亮度? court 和 frield这两个单词在表示“球场”的时候有什么不同? 如题 承办审判庭是什么意思 双十一淘宝卖家发错货怎么处理 友猫和舒仕盾随身wifi哪个好 苏联为什么要割走外蒙 世界上最可爱的病 扫墓上坟时贡品的数量? 窗边的小豆豆读后感悟 表扬小学生之星称号 因为性价比,让我选择了嘉际以及浅谈用车感受 以 珍惜 为名字求七绝诗句素求 劳动法底薪1808.有些月不天数也保底吗