C#编写文本编辑器
文档的绘制,这里的绘制包括在计算机屏幕上绘制文档内容和在打印机上绘制。程序根据计算好的对象在视图区中的坐标,进行一些坐标转换,在图形输出对象上绘制对象,比如绘制一个文字或图片。由于.NET框架中,操作屏幕和打印机都是基于GDI+的,两者没有本质差别,因此一些处理的绘制代码可以绘制屏幕,也可以绘制打印机。在屏幕上绘制文档还特别需要优化,尽量减少闪烁。
环境消息的处理,环境消息指一些Windows消息,这些消息应该改变文档内容,比如鼠标键盘消息,系统粘贴板的相关消息。程序处理这些消息,修改文档对象树,向对象树插入删除或修改文档元素对象。文档对象树发生改变后需要重新对文档进行排版,处理进行段落计算和文档行计算,重新计算对象在视图区中的位置,然后根据需要刷新屏幕显示。此外还有用户选择文档内容时也要处理。
文档的保存,程序根据文档对象树生成一些数据,然后保存到文档存储系统,这一步可以看作对象序列化。
应用程序的开放性,提供二次开发的能力,提供类似VBA的功能
一个完整的功能不弱的文本编辑器结构是很复杂的,涉及到的问题非常广泛,没有数万行的代码是搞不定的,这些问题在本文是不可能一一列出来并进行讨论,在此只好挑一些重点来说说。
文档对象模型
在实际开发时不必挨个解决问题,我是首先确定文档对象树的结构,这里使用了文档对象模型的概念,其实我们已经碰到很多种文档对象模型,最多的莫过于HTML文档对象模型,我们用JavaScript来控制HTML页面内容时就是使用HTML文档对象模型,此外还有XML文档对象模型,VBA操作的是Word或Excel文档对象模型。使用文档对象模型,可将文档中所有的内容和内存中的某个对象联系起来,当应用程序修改了内存的对象的数据,则相应的文档内容就修改了。删除了内存中的对象也就删除了相应的文档内容。一些文档对象模型的思想可以参考。
文档对象模型中有很常见的是对象的继承和重载。大家可以看看.NET类库的
System.XML名称空间下定义的XML文档对象模型,你可以发现无论是XML文档对象(XMLDocument),XML节点(XMLElement)还是属性(XMLAttribute),甚至注释
(XMLComment)纯文本数据(XMLText)都是从抽象类XMLNode继承过来的。这样设计的好处是可以很方便的遍历XML文档对象树,各种对象都是从XMLNode派生的,都根据各自需要重载一些成员方法,其他程序都可把这些对象都看作XMLNode来使用,利用对象方法的重载和多态性来实现各自不同的处理。
基础对象
在这种指导思想下,我也定义了一个抽象类TextElement,所有的文档对象都是从该对象派生的。该类定义了以下虚成员
Left,Top,Width,Height属性,用于表示对象在的位置和显示大小
RealLeft , RealTop 只读属性,表示对象在视图区域中的显示位置
RefreshSize 方法,用于重新计算对象的显示大小
RefreshView 方法,重新绘制对象
HandleMouseDown 方法,处理鼠标按键按下事件