如何用C#编写文本编辑器
日期:2008年6月2日 作者: 查看:[大字体 中字体 小字体]-
本文探讨了使用C#从底层开发一个带格式的文本编辑器的任务,深入探讨了其中的文档对象模型的设计,图形化用户界面的处理和用户操作的响应,说明了其中的某些技术问题和解决之道。
前言
小弟从大学里开始接触编程也有6年了,工作4年也是干编程的活,见过不少程序,自己也编过不少,在学校编程自己觉得是搞艺术品,其实玩一些游戏,比如文明法老王星际等从某些角度看也是搞艺术品,看着自己苦心经营的建筑物和人员由少变多,由简单变复杂,心中有些成就感。编程也一样,程序从几十行写到上万行,功能由HellowWord到相当复杂而强大,心中也有不少成就感。
毕业后工作,才渐渐感悟软件开发本质上是做一个工具,这个工具给别人或者自己用。有了工具,很多问题就迎刃可解了。如此开来偶们程序员和石匠铁匠木匠是同一类人了。不过没什么,程序员本来就没高人一等,人在社会,认认真真的工作就行了。
问题
废话不多说了,现在谈谈标题提出的问题,如何用C#编写文本编辑器。本人有幸开发过一个比较复杂的文本编辑器,因此也算有点经验吧,在此来分享一下。这里所指的文本编辑器不是简单的像Windows自带的单行或多行文本编辑框,而是类似于Word的文本编辑器。
粗看起来,一个编辑器有什么好难的,其实很难的,因为我们认为容易的事对计算机来说确实天大的问题。比如大家经常上网,可以发现最近几年很多网站登录时除了输入用户名和密码后还要输入所谓的验证码,而验证码则在输入框旁边歪歪扭扭的画了出来,就像小学一年纪的学生在一张脏纸上写的一样,这样做只是为了防止程序来模拟登录,因为歪歪扭扭的文字人类可以很容易的辨认,而计算机则很不容易辨认。
例子:注册hotmail使用的验证码,其显示的字符为 8UV9BKYR 。一个文本编辑器主要处理的问题有
文件保存格式的定义,文档保存为文本格式还是二进制格式的,文档中各个信息单元保存什么信息。文档格式很重要。
和文档存储系统的交流,也就是保存和加载文档的功能,这里的文档存储系统可以是操作系统文件子系统,数据库,网络,其实文件格式定下了,各种文档存储系统差别不大。
文档加载后的文档对象维护,面对比较复杂的文档处理,需要使用面向对象的编程思想,认真分析文档结构,将加载的文档数据一点点肢解掉,每一个最小的不可分割的文档数据转换为一个对象,然后使用一个对象树来保存文档内容的层次关系,这样构造一个文档对象树。文档编辑工作就是维护这个文档对象树了。
文档对象的排版,文档加载后需要处理整个文档对象树,计算每个对象的显示大小,然后在视图区中排列要显示的对象,包括段落和文档行的计算,然后计算对象在视图区域中的直角坐标参数。
文档的绘制,这里的绘制包括在计算机屏幕上绘制文档内容和在打印机上绘制。程序根据计算好的对象在视图区中的坐标,进行一些坐标转换,在图形输出对象上绘制对象,比如绘制一个文字或图片。由于.NET框架中,操作屏幕和打印机都是基于GDI+的,两者没有本质差别,因此一些处理的绘制代码可以绘制屏幕,也可以绘制打印机。在屏幕上绘制文档还特别需要优化,尽量减少闪烁。
环境消息的处理,环境消息指一些Windows消息,这些消息应该改变文档内容,比如鼠标键盘消息,系统粘贴板的相关消息。程序处理这些消息,修改文档对象树,向对象树插入删除或修改文档元素对象。文档对象树发生改变后需要重新对文档进行排版,处理进行段落计算和文档行计算,重新计算对象在视图区中的位置,然后根据需要刷新屏幕显示。此外还有用户选择文档内容时也要处理。
文档的保存,程序根据文档对象树生成一些数据,然后保存到文档存储系统,这一步可以看作对象序列化。
应用程序的开放性,提供二次开发的能力,提供类似VBA的功能
一个完整的功能不弱的文本编辑器结构是很复杂的,涉及到的问题非常广泛,没有数万行的代码是搞不定的,这些问题在本文是不可能一一列出来并进行讨论,在此只好挑一些重点来说说。文档对象模型
在实际开发时不必挨个解决问题,我是首先确定文档对象树的结构,这里使用了文档对象模型的概念,其实我们已经碰到很多种文档对象模型,最多的莫过于HTML文档对象模型,我们用javascript来控制HTML页面内容时就是使用HTML文档对象模型,此外还有XML文档对象模型,VBA操作的是Word或Excel文档对象模型。使用文档对象模型,可将文档中所有的内容和内存中的某个对象联系起来,当应用程序修改了内存的对象的数据,则相应的文档内容就修改了。删除了内存中的对象也就删除了相应的文档内容。一些文档对象模型的思想可以参考http://www.w3.org。
文档对象模型中有很常见的是对象的继承和重载。大家可以看看.NET类库的System.XML名称空间下定义的XML文档对象模型,你可以发现无论是XML文档对象(XMLDocument),XML节点(XMLElement)还是属性(XMLAttribute),甚至注释(XMLComment)纯文本数据(XMLText)都是从抽象类XMLNode继承过来的。这样设计的好处是可以很方便的遍历XML文档对象树,各种对象都是从XMLNode派生的,都根据各自需要重载一些成员方法,其他程序都可把这些对象都看作XMLNode来使用,利用对象方法的重载和多态性来实现各自不同的处理。
基础对象
在这种指导思想下,我也定义了一个抽象类TextElement,所有的文档对象都是从该对象派生的。该类定义了以下虚成员
Left,Top,Width,Height属性,用于表示对象在的位置和显示大小
- [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页
-
- 如何用C#编写文本编辑器 相关文章:
- ·巧用 Word 编辑文档中的不同页眉
- ·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!
- ·国外流行的五款免费在线图片编辑器评测
- ·剪辑数字影像 影像编辑软件大荟萃
- ·如何用C#编写文本编辑器
- ·Vi编辑器的基本使用方法
- ·Word:公式编辑器亲密接触
- ·IE嘲讽者致无法打开注册表编辑器
- ·注册表进行编辑的基本技巧
- ·二进制文件编辑器
- 如何用C#编写文本编辑器 相关软件
- ·ICO图标提取编辑专家 V4.7
- ·JP-Word简谱编辑 V3.0
- ·Lrc歌词编辑器 2008 07.15
- ·三国志11 属性编辑器
- ·《辐射2》存档物品编辑器
- ·PowerExif 编辑器 V1.2 专业版
- ·视频播放、编辑、RMVB压片全教程 V2.0
- ·宽网MP3编辑器 v5.10
- ·汇编集成编辑器 V1.05
- ·腾讯QQ场景编辑器 V1.00
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:巧用WinRAR让加密文件变颜色
下一篇:地址栏参数的判断总结
精品推荐
热点TOP10
- ·用C#写计算器程序
- ·通常C#面试题
- ·身份证号码15位升18位(C#)
- ·C#编写的windows计算器-源代码
- ·C#導出Excel源碼
- ·ASP.NET购物车的实现及结算处理
- ·C#中使用进度条
- ·ASP.NET程序中常用的三十三种代码
- ·[C#]解决读写包含汉字的txt文件时乱码的问题
- ·asp.net(C#)海量数据表高效率分页算法(易懂,不使用存储过程)
- ·C#获取本地计算机名IP,Mac地址
- ·AspNetPager分页控件--使用方法
- ·c#操作word表格
- ·ASP.NET SESSION的使用及原理
- ·在C#.net中如何操作XML
- ·ASP.NET中水晶报表的使用
- ·ASP.NET技巧:GridView控件自定义分页详解
- ·.Net环境下有关打印页面设置、打印机设置、打印预览对话框的实现
- ·ASP.NET:Repeater控件的详解
- ·DataList分页、增加、删除、修改实例
特别推荐
- ·ASP.NET 2.0角色及成员管理
- ·如何利用C#创建和调用DLL
- ·ASP.NET的几个特点
- ·实例分享:自己开发的自定义分页控件
- ·ASP.NET之上传文件管理策略
- ·ASP.NET程序中常用的三十三种代码
- ·ASP.Net中保护自定义的服务器控件
- ·C#设计的一个向导程序(Wizard)框架
- ·.net中即时消息发送的实现……
- ·ASP.NET动态创建控件之绝境求生
- ·.NET调用Oracle存储过程,使用数组类型的参数(如ArrayList)
- ·C#中水晶按钮的程序生成
- ·日历函数单元
- ·图片保存到数据库和从数据库读取图片并显示(c#)
- ·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!
- ·C#中四种进程或线程同步互斥的控制方法
- ·[C#]解决读写包含汉字的txt文件时乱码的问题
- ·AspNetPager分页控件--使用方法
- ·六步使用ICallbackEventHandler实现无刷新回调
- ·从 ASP.NET 服务器控件插入客户端脚本
