XDesigner.Writer演示版程序下载地址/Files/xdesigner/XDesigner.Writer.Test.rar ,运行在微软.NET2.0环境中。
XDesigner.Writer 文本编辑器中间件软件
袁永福 2012-5-9
28348092#qq.com
XDesigner.Writer文本编辑 器组件是一个完全用C#开发的、运行在微软.NET框架
下的软件组件,它没有使用MS Word、RicthEditBox等其他任何文本编辑器组件,完全
靠自己实现了富格式文本编辑功能。可以非常完美的集成到.NET应用系统中,可以用
于WinForm.NET、ASP.NET、命令行程序或者后台服务程序的开发中。本文档也是完全
使用XDesigner.Writer编辑的,并导出为HTML文档。
在很多应用系统中要处理带格式的文本文档,此时很多 开发人员采用以下两种方
式:
一种是使用RichTextBox控件,调用这种控件的编程接口来改变文档的内容,但这
种方式属于间接操作文档,很吃力,难以对文档进行精细的调整。而且在ASP.NET应用
系统中由于无法使用WinForm控件,因此也就无法使用RichTextBox控件了。实践证
明,使用RichTextBox控件可以对格式文档进行简单的处理,但要进行很精细的处理那
是费力不讨好的。
另外一种是使用MS Word自动化对象。这种方式能精细的控制格式文档,但系统必
须安装MS Word软件,而且这种方式很依赖计算机的配置,当开发机器中的Word版本和
运行时机器的Word版本不一致时,容易出现各种错误。此外使用MS Word自动化对象存
在性能不稳定,工作不可靠的问题,很容易导致在内存中出现大量的MS Word的进程,
产生严重的资源泄露问题。
为了解决上述问题,作者开发这个XDesigner.Writer文本编辑器组件,该组件完
全使用C#开发的,运行在微软.NET框架的环境下。开发过程没有使用任何其他第三方
组件,没有使用MS Word,RichEdit或其他文本编辑器组件,本软件中的文档加载,保
存,文档的显示,文档的编辑操作以及打印等等功能全部用C#开发。未来作者将以此
为基础开发各种功能,比如痕迹保留、加密复制粘贴、文档中特定区域只读和保护、
断点续打、数据源绑定。
本程序是XDesigner.Writer的演示程序,仅供学习和研究使用,不要用于实际工
程项目中。欢迎大家向软件作者提出功能意见。 作者电子邮件:[email protected]。
支持的文档样式
本文本编辑器组件可以使用带格式的文本图片混排,并实现了所见即所得的编辑
界面,其编辑样式和实际打印输出是一致的。而且能将文档保存到一个XML文件中。也
可导出为RTF或者HTML文档。
支持文本输入域
当插入点或者鼠标光标悬停在这个文本输入域时就会以指定的背景色高亮度突出
显示出来。
文本输入域可以设置背景文本,当文本输入域没有任何内容时就以灰色显示背景
文本,向用户提供提示信息。如下图所示:
支持日期输入域 ,如下图所示,双击这个输入域或按下F2键即可弹出一个日期型
选择界面,用户点击某个日期即可完成数据的录入。
支持时间日期输入域 ,如下图所示:
支持数字输入域 ,可以设置数据校验格式,例如
在这里,年龄设置为最小值为0,最大值为150。编辑器会自动进行数据校验,若
校验不通过则以红色背景突出显示这个输入域并设置提示文本。
支持下拉列表 ,如下图所示:
这个下拉列表的列表内容可以手动编辑,也可以编程读取数据库获得。在这个列
表中,用户可以使用拼音码快速定位列表项目,该拼音码是根据列表文本自动计算
的,无需手工设置。
这个输入域还可以限制为用户不能直接修改文本值而只能通过弹出式的列表来选
择值。
支持单选框和复选框。如下图所示:
可以为单选或者复选框设置组名,对于单选框,同组的最多只能有一个单选框被
勾选。而且鼠标悬停在一个单选框或者复选框时,同组的单选框或者复选框全都以蓝
色背景高亮度显示。
级联模板, 能根据当前输入域中的值来动态的修改后续输入域是否可见,而且这种
操作是可以套嵌的。例如:
当吸烟输入域选择为“吸烟”值时,后面的关于详细描述吸烟的文本片段将显示出
来。当吸烟输入域选择其他值时,后面的文本片段将不显示。如下图所示:
注意,详细描述吸烟情况的文本片段只是隐藏,这个过程是可逆的,当用户再次
选择“吸烟”值时,该文本片段又会显示出来。
级联模板时可以套嵌使用的。如当用户选择“有戒烟治疗”时,后面就会显示关
于戒烟治疗的详细描述文本片段,如下图所示:
当用户选择“无戒烟治疗”时,后面的那段片段就隐藏不显示了。
在这段文本中,当用户选中了“吸烟”选项,则后面关于描述吸烟详细情况的一
段文本输入域就显示出来,否则就隐藏掉。被隐藏的区域不是删除掉了,而且不可
见,仍然处于等待显示的状态。类似的,当设置“有戒烟治疗”,则后面就会显示出
关于戒烟治疗的详细信息。
字段域可以绑定数据源 ,文档对象有一些内置参数,字段域就可以绑定到这些参
数来显示参数值。例如显示当前页码[9],当前日期:[2012/4/30 0:00:00]。
字段域也可以修改绑定的数据源,比如编辑控件有一个ServerObject属性,将数
据源对象设置到该属性上,然后可以在文档中使用参数名ServerObject来获得该对
象,并可读取或设置该对象的属性值。
在本演示程序中,编辑器控件的ServerObject属性设置了一个对象,然后使用字
段域来显示和修改对象的手续值,例如,这个域显示Name属性:[张三],Birthday:[
1990/1/1 0:00:00],国籍:[中国]。
支持表格 ,如下图所示:
还能以如下图所示的对话框来设置表格的边框和背景:
支持段落设置,提供如下图所示的对话框来设置段落的段前间距,段后间距,行
间距。
支持各种字体样式, 如下图所示:
支持数字式的列表和圆点式的列表 ,如下图所示:
支持图片 ,可以通过菜单栏插入图片,也可以使用鼠标拖拽方式从 我的电脑 或 资
源管理器 中拖拽一个图片文件到文档中。用鼠标点击图片,则该图片处于选择状态,
可以看到在图片周围有8个小方框,您可以使用鼠标拖拽来改变图片的大小。
显示模式
XDesigner.Writer支持页面显示模式和普通显示模式,如下图所示:
页面显示模式
普通显示模式
续打
XDesigner.Writer支持续打功能。如下图所示:
当文本编辑器处于续打模式,此时用户可以使用鼠标点击操作来设置续打位置,此
时被蓝色半透明区域的内容不会打印,而且续打的第一页不打印页眉页脚。
选择区域的显示模式
XDesigner.Writer支持两种被选择区域的显示模式。
反色高亮度显示被选择区域,如下图所示:
对RTF格式的支持
本编辑器全面支持 RTF 格式,能读取和保存RTF文件,也能复制和粘贴RTF格式的文
本。本程序可以读取MS Word或Windows写字板程序保存的RTF文件,MS Word或Windows
写字板也可正确显示本程序保存的RTF文件。
操作特性
本文本编辑器实现了所见即所得的编辑模式,在编辑界面中文档的显示样式和最
终打印输出样式保持一致,没有差别。此外还实现了 续打 功能,您按下视图主菜单的
续打模式 菜单项目,则文本编辑器进入续打显示模式,此时文档的一部分被半透明的
蓝色区域覆盖,你可以使用鼠标点击操作来设置续打位置,此时打印时,蓝色区域覆
盖的部分将不会打印,而且发生续打的那页不会打印页眉和页脚。
本文本编辑器实现了100次的重做和撤销操作能力。您对文档的任何修改都能撤销
和重做。但对系统设置中的操作修改了文档样式则无法进行重做或撤销。
本文本编辑器支持OLE拖拽,你可以从资源管理器中拖拽一个图片文件到文档中,
也可以从IE浏览器或者MS Word或支持OLE拖拽的软件中拖拽一段文本到文档中。你可
以从其他程序复制图片,纯文本或RTF文本数据到文档中。
性能
本文本编辑器虽然是使用相对比较缓慢的.NET开发的,但运行时的响应速度是比
较快的,基本上没有闪烁,能处理比较大的文档,但超过100页则处理有些迟钝。而且
删除或粘贴过万字符的文档时响应会有些迟钝。本程序启动时会有点慢,这是.NET程
序的通病:(。
在本演示程序中,你可以点击工具条上的“系统设置”按钮来打开系统设置对话
框来设置本文本编辑器的一些性能参数,可以设置三种文字显示质量,也可以设置启
用或禁止双缓冲设置。下图就是系统设置对话框的图片
VBA功能
XDesigner.Writer支持VBA功能,能将一段VBA代码嵌入在文档中,伴随文档的编
辑操作而执行。
例如有以下VBA代码。
sub Document_DocumentContentChanged()
window.StatusText = DateTime.Now.ToString() + " 修改了文档内容"
end sub
sub Document_SelectionChanged()
window.StatusText = DateTime.Now.ToString() + " 移动的插入点的位置"
end sub
sub Document_DocumentLoad()
window.StatusText = DateTime.Now.ToString() + " 加载了文档"
end sub
当用户编辑了文档,在嵌入在文档中的这段VBA代码就能实时运行。开发者可以编
写VBA脚本代码来增强XDesigner.Writer的功能。
开发接口
XDesigner.Writer提供了丰富的开发接口,以及良好的设计时支持。
XDesigner.Writer提供了一个类型全名为XDesigner.Writer.Controls.
WriterControl类型的WinForm控件,该控件用于显示和编辑文档内容。
标准软件命令功能清单
模块 |
命令名 |
说明 |
Browse |
浏览文档相关的功能命令,不会修改文档内容。 |
|
|
AboutControl |
显示关于软件组件的对话框。 |
|
CtlMoveDown |
模拟Ctl+向下光标按键的功能,能向下滚动整个文档视 图而不修改当前插入点的位置。 |
|
CtlMoveUp |
模拟Ctl+向上光标按键的功能,能向上滚动这个文档视 图而不修改当前插入点的位置。 |
|
JumpPrintMode |
启动或取消续打状态。 |
|
MoveDown |
将插入点移动到下一行。 |
|
MoveEnd |
将插入点移动到行尾。 |
|
MoveHome |
将插入点移动到行首。 |
|
MoveLeft |
将插入点向前移动到上一个字符的前面。 |
|
MovePageDown |
让视图向下翻页,并移动插入点。 |
|
MovePageUp |
让视图向上翻页,并移动插入点。 |
|
MoveRight |
将插入点向后移动到下一个字符的前面。 |
|
MoveUp |
将插入点移动到上一行。 |
|
PageViewMode |
切换到分页视图模式。 |
|
NormalViewMode |
切换到普通视图模式。 |
|
Replace |
暂不支持。 |
|
Search |
暂不支持。 |
|
SelectAll |
文档内容全选。 |
|
ShiftMoveDown |
将插入点移动到下一行,并选择所经过的文档内容。 |
|
ShiftMoveEnd |
将插入点移动到行尾,并选择所经过的文档内容。 |
|
ShiftMoveHome |
将插入点移动到行首,并选择所经过的文档内容。 |
|
ShiftMoveLeft |
将插入点向前移动一个字符,并选择所经过的文档内 容。 |
|
ShiftMovePageDown |
将视图向下翻页,修改插入点的位置,并选择所经过的 文档内容。 |
|
ShiftMovePageUp |
将视图向上翻页,修改插入点的位置,并选择所经过的 文档内容。 |
|
ShiftMoveRight |
将插入点向后移动一个字符,并选择所经过的文档内 容。 |
|
ShiftMoveUp |
将插入点移动到上一行,并选择所经过的文档内容。 |
Edit |
编辑文档内容相关的命令功能,会修改文档内容。 |
|
|
AlignCenter |
段落水平居中对齐。 |
|
AlignJustify |
段落水平两边对齐。 |
|
AlignLeft |
段落水平左对齐。 |
|
AlignRight |
段落水平右对齐。 |
|
BackColor |
暂不支持。 |
|
Backspace |
退格,删除文档选择区域或插入点前一个文档元素。 |
|
Bold |
设置或取消粗体字体样式。 |
|
BorderBackgourndFormat |
设置表格单元格的边框和底纹。 |
|
BorderBottom |
暂不支持。 |
|
BorderLeft |
暂不支持。 |
|
BorderRight |
暂不支持。 |
|
BorderTop |
暂不支持。 |
|
BulletedList |
设置段落为圆点列表样式。 |
|
Color |
设置文本颜色。 |
|
Copy |
复制。 |
|
Cut |
剪切。 |
|
Delete |
删除。 |
|
DeleteField |
删除文本域。 |
|
DocumentValueValidate |
对文档所有的数据输入域进行数据校验。 |
|
EditImageAdditionShape |
编辑图片元素附加的额外图形数据。 |
|
ElementProperties |
编辑元素属性。 |
|
FirstLineIndent |
设置或取消段落首行缩进。 |
|
Font |
设置文档中所选择的文字的字体。 |
|
FontName |
设置文档中所选择的文字的字体名称。 |
|
FontSize |
设置文档中所选择的文字的字体大小。 |
|
InsertCheckBox |
在插入点位置插入复选框。 |
|
InsertImage |
在插入点位置插入图片。 |
|
InsertLineBreak |
在插入点位置插入软回车。 |
|
InsertMode |
切换替换和插入的编辑模式。 |
|
InsertParameter |
暂不支持。 |
|
InsertRTF |
插入一段RTF文档。 |
|
InsertString |
插入一段纯文本。 |
|
Italic |
设置或取消文档中所选择的字体为斜体样式。 |
|
NumberedList |
设置段落为数字式的列表方式。 |
|
ParagraphFormat |
设置段落格式,包括行间距,段前段后间距等。 |
|
Paste |
粘贴。 |
|
Redo |
重复执行操作。 |
|
Strikeout |
设置或取消删除线字体样式。 |
|
Subscript |
设置或取消下标字体样式。 |
|
Superscript |
设置或取消上标字体样式。 |
|
Underline |
设置或取消下划线字体样式。 |
|
Undo |
撤销刚刚执行的操作。 |
File |
文档操作相关的命令。 |
|
|
FileNew |
标准的新增文件操作。 |
|
FileOpen |
标准的打开本地文件操作。 |
|
FilePageSettings |
编辑文档的页面设置。 |
|
FilePrint |
打印文档。 |
|
FilePrintCurrentPage |
打印当前页。 |
|
FileSave |
标准的保存文件操作。 |
|
FileSaveAs |
标准的另存为文件操作。 |
|
DocumentOptions |
显示文档属性设置对话框。 |
Table |
表格相关的操作。 |
|
|
Table_DeleteColumn |
删除选中的表格列,可一次删除多个表格列。 |
|
Table_DeleteRow |
删除选中的表格行,可一次删除多个表格行。 |
|
Table_DeleteTable |
删除整个表格。 |
|
Table_InsertColumnLeft |
在当前单元格的左边插入新的表格列。 |
|
Table_InsertColumnRight |
在当前单元格的右边插入新的表格列。 |
|
Table_InsertRowDown |
在当前行的下面插入新的表格行。 |
|
Table_InsertRowUp |
在当前行的上面插入新的表格行。 |
|
Table_InsertTable |
在文档中插入新的表格。 |
|
Table_MergeCell |
合并单元格。 |
|
Table_SplitCell |
拆分单元格。 |
例如在窗体中放置一个类型为XDesigner.Writer.Controls. WriterControl 的控件,名
称为myEditorControl ,则可以使用以下代码来调用一些功能模块:
例如使用下面的代码就能在文档的当前位置插入字符串:
myEditControl.ExecuteCommand( "InsertString" , false , "abc" );
使用下面的代码就能在文档的当前位置插入一小段RTF内容:
myEditControl.ExecuteCommand( "InsertRTF" , false , @"{\rtf1\ansi\ansicpg936\deff0\
deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}
{\colortbl ;\red255\green0\blue0;}
{\*\generator Msftedit 5.41.21.2510;}{\info{\horzdoc}{\*\lchars ([\'7b\'a1\'a4\'a1\
'ae\'a1\'b0\'a1\'b4\'a1\'b6\'a1\'b8\'a1\'ba\'a1\'be\'a1\'b2\'a1\'bc\'a3\'a8\'a3\'
ae\'a3\'db\'a3\'fb\'a1\'ea\'a3\'a4}{\*\fchars !),.:\'3b?]\'7d\'a1\'a7\'a1\'a4\'a1\
'a6\'a1\'a5\'a8\'44\'a1\'ac\'a1\'af\'a1\'b1\'a1\'ad\'a1\'c3\'a1\'a2\'a1\'a3\'a1\'
a8\'a1\'a9\'a1\'b5\'a1\'b7\'a1\'b9\'a1\'bb\'a1\'bf\'a1\'b3\'a1\'bd\'a3\'a1\'a3\'a2
\'a3\'a7\'a3\'a9\'a3\'ac\'a3\'ae\'a3\'ba\'a3\'bb\'a3\'bf\'a3\'dd\'a3\'e0\'a3\'fc\'
a3\'fd\'a1\'ab\'a1\'e9}}
\viewkind4\uc1\pard\sa200\sl276\slmult1\lang2052\f0\fs22 1\cf1 2\cf0 3\par
}" );
使用下面的代码就能直接以XML的方式设置控件的文档内容:
myEditControl.XMLText = @"<?xml version='1.0'?>
<XTextDocument xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='
http://www.w3.org/2001/XMLSchema'>
<XElements>
<Element xsi:type='XTextBody'>
<XElements>
<Element xsi:type='XString'>
<Text>111</Text>
</Element>
<Element xsi:type='XString' StyleIndex='0'>
<Text>111</Text>
</Element>
<Element xsi:type='XString' StyleIndex='1'>
<Text>11</Text>
</Element>
<Element xsi:type='XString' StyleIndex='2'>
<Text>1</Text>
</Element>
<Element xsi:type='XString'>
<Text>11</Text>
</Element>
<Element xsi:type='XParagraphFlag' />
</XElements>
</Element>
<Element xsi:type='XTextHeader'>
<XElements>
<Element xsi:type='XParagraphFlag' />
</XElements>
</Element>
<Element xsi:type='XTextFooter'>
<XElements>
<Element xsi:type='XParagraphFlag' />
</XElements>
</Element>
</XElements>
<Info>
<CreationTime>2012-03-29T15:47:51.1032576+08:00</CreationTime>
<LastModifiedTime>2012-03-29T15:47:51.1042577+08:00</LastModifiedTime>
<LastPrintTime>1980-01-01T00:00:00</LastPrintTime>
<Operator>XDesigner.Writer Version:1.0.1111.28434</Operator>
</Info>
<DefaultFont>
<Size>12</Size>
</DefaultFont>
<ContentStyles>
<Default>
<FontName>宋体</FontName>
<FontSize>12</FontSize>
</Default>
<Styles>
<Style Index='0'>
<Bold>true</Bold>
</Style>
<Style Index='1'>
<FontSize>24</FontSize>
<Bold>true</Bold>
</Style>
<Style Index='2'>
<FontSize>24</FontSize>
</Style>
</Styles>
</ContentStyles>
<DocumentGraphicsUnit>Document</DocumentGraphicsUnit>
<PageSettings>
<DesignerPaperWidth>0</DesignerPaperWidth>
<DesignerPaperHeight>0</DesignerPaperHeight>
</PageSettings>
<CustomerParameters />
</XTextDocument>" ;
XDesigner.Writer支持WPF,如使用以下XAML代码就能建立一个包含文本编辑器控
件的WPF窗体,这样就能在C#代码中以myWriterControl的名称访问文本编辑器控件
了。
< Window x : Class ="XDesigner.Writer.WPFTest.MainWindow"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns : my ="clr-namespace:XDesigner.Writer.Controls;assembly=XDesigner.Writer"
Title ="MainWindow" Height ="463" Width ="777" Loaded ="Window_Loaded">
< Grid >
< WindowsFormsHost Margin ="0,29,0,0">
< my : WriterControl x : Name ="myWriterControl" BackColor ="Gray" BorderStyle ="Fixed3D
" AllowDrop ="True" />
</ WindowsFormsHost >
</ Grid >
</ Window >