DCWriter文本编辑器软件使用说明 - 图文 下载本文

DCWriter电子病历文本编辑器软件说明

1. 简介

DCWriter电子病历文本编辑器软件(简称DCWriter)是一款完全用C#编写的、运行在微软.NET平台上的软件组件,没有使用MS Word、RichEditBox等其他任何文本编辑器组件,完全自主实现了富格式文本编辑功能。可以非常完美的集成到各类.NET应用系统中,包括WinForm.NET、WPF、ASP.NET、命令行程序或者后台服务程序。

DCWriter除了实现了强大的通用文本编辑功能外,还针对电子病历业务添加了续打、输入域、半结构化文档、级联模板、三级查房权限控制、痕迹保留、医学表达式等功能,是开发电子病历应用系统的理想基础。

2. 运行环境

DCWriter运行在微软Windows操作系统以及微软.NET框架2.0及更高版本的系统中,硬件为x86 PC机及兼容系统。

3. 功能点介绍

DCWriter详细的功能点有

3.1. 文档编辑功能

1 2 3

DCWriter提供强大的文档编辑功能,主要有:

文字编辑功能。包括设置字体名称、字体大小、粗体、斜体、下划线样式、文字颜色、文字背景色、上下标。

支持数字式的和圆点式的段落列表。

支持图片,支持鼠标拖拽改变图片大小,支持在图片中添加批注信息,批注信息保存后可以再编辑。可以使用如下图所示的对话框来编辑图片批注信息。

4

支持段落设置。支持段落左缩进、行首缩进、段前间距、段后间距、行间距。可以使用如下图所示的对话框来设置参数。

5 6

支持表格。支持单元格的无限制的横向合并和纵向合并。单元格内可以进行图文混排。支持无限制的表格套嵌表格。可以设置表格的标题行。

可以使用如下图所示的对话框来设置单元格和图片的边框和背景。

7

DCWriter支持两种页面视图模式

分页视图模式,这种模式下文档的显示结果和打印一样:

普通视图模式:

8 被选择区域高亮度显示模式。DCWriter支持两种被选择区域的显示模式。

反色高亮度显示被选择区域,如下图所示:

半透明色高亮度显示被选择区域,如下图所示:

9

重做、撤销。DCWriter支持不受次数限制的重做和撤销操作。对文档的任何修改都能重做和撤销。

10 OLE拖拽。DCWriter支持OLE拖拽来插入内容。可以从Windows资源管理器中拖拽图片文

件到编辑器中而插入图片内容。也支持从MS Word或者其他文档编辑器中拖拽插入数据。还支持拖拽文档内容来编辑文档内容。

3.2. 痕迹保留和权限控制

DCWriter支持痕迹保留和权限控制。实现的功能点有: 1. 分等级的权限控制

DCWriter支持分等级的权限控制。用户能向编辑器登记用户登录信息并指定用户的权限等级,用户权限等级是一个整数,数值越大则权限就越高。低权限的用户不能修改和删除高权限的用户输入的文档内容,而高权限的用户能修改和删除低权限的用户输入的内容;而且低权限用户输入的内容被高权限的用户修改了样式后,则这些内容就转而属于高权限的用户的,此时低权限用户就不能修改和删除这些曾经由自己输入的内容了。

DCWriter编辑器提供一种管理员模式,当运行在该模式下,权限控制无效,文档中的任意部分都可修改。

2. 逻辑删除和物理删除

DCWriter支持逻辑删除和物理删除,逻辑删除就是程序并不删除文档内容,而是标记为逻辑删除了,不可见。此时当编辑器允许显示逻辑删除的内容时,这些被隐藏的内容又显示出来了,此时会附加上红色删除线的标记。

物理删除就是真正的删除文档内容,此时被删除的内容就不再存在,也就不可能再次显示出来了。

3. 痕迹保留和再现

DCWriter支持痕迹保留和再现。能以单条蓝色下划线显示权限等级为1(一般对应于主治医师)输入的内容;以蓝色双下划线显示权限等级大于等于2(一般对应于主任医师)输入的内容;以单条红色删除线显示被权限等级为1的用户逻辑删除的内容;以红色双删除线显示被权限等级大于等于2的用户逻辑删除的内容。

当鼠标移动到标记了痕迹信息的文档内容上面时会显示相关的提示文本进行详细说明。如下图所示,这段文档就留下了用户修改痕迹:

在这里,被红色删除线标注的文档内容就是被逻辑删除的部分。当编辑器不显示逻辑删除的内容时,这段文档就显示如下:

当不显示修改痕迹时,也就是处于整洁显示模式下,此时文档内容显示如下:

DCWriter支持整洁打印,此时打印出来的文档不显示被逻辑删除的内容,也不会显示权限标记。在进行整洁打印时,当文本编辑器处于整洁视图模式下,支持续打、支持打印当前页。若文本编辑器显示了用户修改痕迹时,不支持续打,也不支持打印当前页的功能。

3.3. 输入域

DCWriter支持输入域的功能,应用系统据此能实现半结构化文档的功能。 DCWriter支持文本输入域,如下所示:

当插入点在文本输入域中或者鼠标光标悬停在文本输入域的上面时,整个文本输入域就会以蓝色背景高亮度显示,以提醒用户。

文本输入域可以设置背景文本,例如:

当这个文本输入域中没有任何内容时,就会显示灰色的背景文本以提醒用户。当用户输

入了内容后,就不再显示背景文本了。

文本输入域可以设置为带有数据校验格式的,例如:

这个年龄输入域设置为不得为空,而且只能输入数字,最小值为0,最大值为150,当输入的数据不符合校验格式时,系统会自动设置为红色背景高亮度显示,当鼠标移到输入域上面是还会显示错误提示信息。

DCWriter还支持时间日期数据的输入,并显示用户界面让用户选择时间日期。例如下面是一个日期数据输入域:

当插入点在文本输入域时按下F2键或者鼠标双击输入域,则会弹出日期选择界面,而用户就可以在这个界面中选择日期值了。 DCWriter支持时间日期输入域,如下所示:

DCWriter还支持下拉列表方式编辑输入域的值,例如:

该输入域能弹出下拉列表来帮助录入数据,在这个列表中,用户可以鼠标点击操作选择列表项目,而可以输入拼音码来快速定位列表项目。这里的拼音码是根据列表中显示的文本自动生成的,无需维护。

这个下拉列表还可以设置为多选,例如:

而且这个列表中的列表项目既可以在编辑文档时录入,也可以通过编程从其他地方加载,比如从数据库加载。

3.4. 医学表达式

DCWriter目前支持2种医学表达式,如下所示:

具有4个文本的医学表达式:

当用户用鼠标双击医学表达式或者选中表达式按下F2键,则医学表达式进入编辑模式,此时显示为:[2012年05月29日,Value2,Value3,Value4]。在这里用户可以直接编辑医学表达式的内容,而且可以套嵌插入输入域来编辑数值。

具有3个文本的医学表达式:。

处于编辑状态下的医学表达式:[Value1,Value2,Value3]。

3.5. 条形码

DCWriter支持30种条码,其样式如下: UPCA UPCE SUPP2 SUPP5 EAN13 EAN8 Interleaved2of5 I2of5 Standard2of5 Code39

Code39Extended Code93 Codabar PostNet BOOKLAND ISBN JAN13 MSI_Mod10 MSI_2Mod10 MSI_Mod11 MSI_Mod11_Mod10 Modified_Plessey CODE11 USD8 UCC12 UCC13 LOGMARS Code128A

Code128B Code128C 3.6. 单选框、复选框

DCWriter支持单选框和复选框。入下图所示: 对于单选框,当鼠标点击设置了勾选状态后,同组的其他单选框就会去掉勾选状态,而且当鼠标光标移动到单选或者复选框上时,系统会以蓝色背景高亮度突出显示同组的其他的单选框或复选框的。

3.7. 级联模板

DCWriter支持级联模板,能根据当前输入域中的值来动态的设置文档其他部分是否可见,而且这种操作是可以套嵌的。例如:

在这里,当用户选择了“吸烟”,则后面的详细描述吸烟的文本片段将显示出来。 当用户选择了“不吸烟”或者为空时,后面的详细描述吸烟的文本片段将自动隐藏掉。如下图所示:

这个过程是可逆的,也就是说,当后面文本片段隐藏后,若用户再次设置“吸

烟”值,则后面的那段文本又显示出来了。

级联模板时可以套嵌的,如下图所示: 当用户选择“有戒烟治疗”时,后面的详细描述戒烟治疗的文本片段会显示出来,当用户选择“无戒烟治疗”时,后面的文本就会隐藏掉,如下图所示:

DCWriter支持更复杂的级联模板功能。

3.8. 数据源绑定

DCWriter中的文本输入域域可以绑定数据源,文档对象有一些内置参数,字段域就可以绑定到这些参数来显示参数值。

字段域也可以修改绑定的数据源,比如编辑控件有一个ServerObject属性,将数据源对象设置到该属性上,然后可以在文档中使用参数名ServerObject来获得该对象,并可读取或设置该对象的属性值。

关于数据源绑定的详细信息可以参考后续相关章节。

3.9. 表达式

DCWriter支持表达式,例如“len( value ) > 3 && value < 999 ”,表达式文本不区分大小写,但字符串值是区分大小写的。目前支持的运算有:

逻辑运算:运算符有“OR”逻辑或、“AND”逻辑与、“NOT”逻辑反。 数学运算:支持加减乘除、“MOD”取模,支持圆括号修改运算优先级。 函数:DCWriter支持以下内置函数 ABS(V) ACOS(V) ASIN(V) ATAN(V) ATAN2(X,Y) 获得绝对值。 计算反余弦值。 计算反正弦值。 计算反正切值。 计算反正切值。

AVERAGE(X1,X2...) CDOUBLE(V,DefaultValue) CEILING(V) CINT(V,DefaultValue) COS(V) COUNT(X1,X2,...) EXP(V) FLOOR(V) INT(V) LOG(A,BASE) LOG(V) MAX(V1,V2...) MIN(V1,V2...) MOD(V,DIVISOR) ODD(V) POW(NUMER,POWER) PRODUCT(V1,V2,V3...) RADIANS(V) RAND() ROUND(V) ROUNDDOWN(V) ROUNDUP(V) SIGN(V) SIN(V) SQRT(V) SUM(V1,V2...) TAN(V) 计算算术平均值。 将指定数据转换为浮点数,第二个参数为转换失败后的返回的默认值。 获得大于等于指定数值的最小整数。 将指定数据转换为整数,第二个参数为转换失败后返回的默认值。 返回指定角度的余弦值。 返回参数的个数。 返回e的n次方。 返回小于等于指定数字的整数。 四舍五入的数字取整。 返回指定底数的对数值。 返回以10为底数的对数值。 返回最大值。 返回最小值。 返回两数相除的余数。 将正(负)数向上(下)舍入到最接近的奇数。 返回某数的乘幂。 返回所有参数的乘积。 将角度转换为弧度。 返回一个介于0到1之间的随机数。 进行四舍五入计算。 向下舍入数字。 向上舍入数字。 为正数返回1,为零返回0,为负数返回-1 。 返回指定角度的正弦值。 返回数值的平方根。 返回所有参数的和。 返回指定角度的正切值。 变量:表达式支持变量。例如“value”表示当前执行表达式的元素的Text值;也可以使用“this.属性名”获得当前元素的指定属性的值,例如“this.Text”、

“this.ID”、“this.Name”;也可以直呼其名的获得文档对象Parameters列表中的文档参数值;还可以直呼其名的获得文档中指定ID或者名称的输入域的值,例如文档中具有一个ID或Name值为“身高”的文本输入域,则可以执行类似“身高<150”这样的表达式。

3.10. 打印

DCWriter支持所见即所得的打印。除了常规的文档打印外,还支持整洁打印和续打。

3.10.1. 整洁打印

整洁打印文档时,不会将文档中的痕迹保留信息打印出来,此时打印的文档比较整洁,不包含各种用户修改痕迹。

3.10.2. 续打

续打,也就是断点继续打印,是一种很特殊的打印功能,DCWriter支持续打功能,如下图所示:

当文本编辑器处于续打模式,此时用户可以使用鼠标点击操作来设置续打位置,此 时蓝色半透明区域中的内容不会打印,而且发生续打的那一页不打印页眉页脚。

3.11. 视图模式

DCWriter支持多种文档视图模式,目前有:

3.11.1. 页面视图模式

页面视图模式如下图所示:

3.11.2. 普通视图模式

普通视图模式如下图所示:

3.11.3. 续打视图模式

续打视图模式如下图所示:

3.11.4. 表单视图模式

表单视图模式如下图所示:

在表单视图模式下,用户只能在文本输入域中编辑内容,输入域之外的内容是只读的,甚至是不可选的,插入点也限制在文本输入域中。

表单视图模式可以和其他视图模式搭配使用。

3.11.5. 复杂视图模式

编辑器控件在复杂视图模式下,能显示所有的用户操作痕迹,包括新增和被逻辑删除的内容。在这种视图模式下,用户删除内容的操作都是逻辑删除。

如下图所示,在复杂视图模式下,文档内容显示如下:

复杂视图模式和简洁视图模式是互斥的,但可以和其他视图模式搭配使用。

3.11.6. 简洁视图模式

编辑器控件在简洁视图模式下,不显示用户操作痕迹,用户删除内容的操作都是物理删除。如下图所示,在简洁视图模式下,文档内容显示如下:

简洁视图模式和复杂视图模式是互斥的,但可以和其他视图模式搭配使用。

3.12. 文件格式

DCWriter支持多种文件格式,主要有

3.12.1. XML格式

DCWriter支持XML文件格式,能读取和保存为XML格式,这种格式是一种自定义的格式,和Word XML或者OpenOffice XML不一样。从开发角度上来说,这个XML文件实际上就是DCWriter内部的文本文档对象模型的XML序列化的结果。

XML格式保存了DCWriter文档的所有的内容,具有一定的向上和向下的兼容性,而且应用程序也可以无需通过DCWriter而直接修改文档中的内容,推荐使用。

3.12.2. RTF格式

DCWriter支持RTF文件格式,能读取和保存RTF文件格式,能识别RTF文档中的表格、页眉、页脚内容。

3.12.3. HTML格式

DCWriter支持将文档保存为HTML文件格式,但不支持打开HTML文件。

3.13. 电子病历功能规范对照表

DCWriter能实现国家制定的《电子病历功能规范》中的针对病历文档编辑器而制定的大

部分功能需求,主要有: 电子病历功能规范条款 第九条第二点:对电子病历数据的创建、修改、删除等任何操作自动生成、保存审计日志(至少包括操作时间、操作者、操作内容等),并提供按审计项目追踪查看其所有操作者、按操作者追踪查看其所有操作等功能。 第十条第一款第一点:支持对各种类型的病历资料的转换、存储管理,并采用公开的数据存储格式,使用非特定的系统或软件能够解读电子病历资料。 第十条第一款第五点:具有电子病历数据备份和恢复功能;当电子病历系统更新、升级时,应当确保原有数据的继承与使用。 DCWriter实现情况 在保存电子病历文档时,编辑器能在文档中保存当前操作员的编号、姓名、保存时间、说明信息等内容,多次保存将产生多条历史记录。 DCWriter能将文档存储为XML或RTF等公开格式的文件。 DCWriter提供向上和向下兼容性,新版本的编辑器能加载旧版本保存的电子病历文档。 第十条第二款第一点:以适当的方式保存完DCWriter能加载电子病历文档并能完整的展整医疗记录,能够以原有样式再现医疗记录。 现出来。 第十三条: 为患者创建电子病历,必须赋予患者唯一的标识号码,建立包含患者基本属性信息的主索引记录,确保患者的各种电子病历相关记录正确地与患者唯一标识号码相对应。 第十四条第一款第一点:为患者(含急诊或其他情况下身份不确定的患者)创建电子病历并赋予统一编码的唯一标识号码功能,通过该标识号码可查阅患者的电子病历相关信息。 第十四条第一款第二点:为每位患者电子病历创建唯一的主索引,并记录患者基本信息(应当至少包括患者姓名、性别、出生日期、常驻地地址等),并能够对患者基本信息进行必要的修改、补充和完善。 第十四条第一款第三点:提供电子病历主索引自动查重功能,按照患者基本信息记录对系统可能存在的重复记录给予提示并由人工确认。 第十五条:提供电子病历自动查重功能,能够将同一患者的多重电子病历与该患者唯一标识号码进行关联,通过唯一标识号码可查阅患者的电子病历相关信息。 创建和维护患者标识号码是应用系统的功能。DCWriter支持向电子病历文档插入自定义附加数据,这些数据就可以是患者标识号码等信息。这样病历文档就能和患者编号相对应了。 电子病历文档中能附加患者号码,这样病历文档就能和患者编号相对应了。 患者基本信息应该是应用系统维护。 电子病历文档中可以插入对这些数据的引用,DCWriter在加载文档时能更新这些引用,从而获得和显示应用系统中最新的患者信息。 电子病历文档能附加上主索引编号,应用系统据此能实现该功能。 电子病历文档可附加患者标识号码,应用系统可以据此实现该功能。 第十九条第二点:提供以自由文本方式录入DCWriter能使用下拉列表的方式辅助快速录诊断(或主诉)、手术及操作名称的功能。 入诊断等具有大量可选项目的数据,也可以用自由文本方式进行录入。 第二十条第一款第二点:提供以自由文本方式录入诊断、手术及操作名称的功能。 DCWriter支持自由文本方式录入。

第二十条第二款第二点:提供为临床试验病例、教学病例等特殊病历资料进行标识的功能。 第二十三条第二点:提供住院病历创建信息补记、修改等操作功能,对操作者应当进行身份识别、保存历次操作印痕、标记准确的操作时间和操作者信息。 第二十四条第一款第一点:支持各类型病历资料录入与编辑的功能。 DCWriter支持附加任意数据,应用系统可以据此实现该功能。 DCWriter支持电子病历文本操作印痕的保存和显示,能记录操作时间和操作信息。 DCWriter支持。 第二十四条第一款第二点:提供按照病历类DCWriter提供接口,应用系统可以根据需要型、内容和要求,根据电子病历系统中相关从多个文档中抽取部分内容,然后组成一个数据,自动生成住院病历部分内容的功能。 新的病历文档。 第二十四条第一款第三点:提供自由文本录入功能。 第二十四条第一款第四点:提供在住院病历指定内容中复制、粘贴患者本人住院病历相同信息的功能;禁止复制、粘贴非患者本人信息的功能。 第二十四条第一款第五点:提供模板辅助录入功能,可以按照住院病历类型、疾病病种选择所需模板;模板内容应当符合该疾病现有诊疗指南、规范要求。 DCWriter提供仿MS Word的用户体验,能自由录入文本。 DCWriter能在病历文档中附加患者标识信息,并提供接口,在复制粘贴操作中提供数据过滤的功能,应用系统据此实现该功能。 应用系统可以调用DCWriter,在一个病历文档中完整的插入另外一个病历文档的内容,从而实现病历文档模板功能。 第二十四条第一款第六点:提供为医疗机构DCWriter支持页面设置。 定制各类型住院病历默认样式的功能,默认样式包括纸张尺寸、字体大小、版面设置等。 第二十四条第一款第七点:提供暂时保存未电子病历文档可以附加数据,应用系统可以完成住院病历记录,并授权用户查看、修改、向病历文档附加操作状态数据,据此实现该完成该病历记录,提供住院病历记录确认完功能。 成并记录完成时间的功能。 第二十四条第一款第八点:提供住院病历记录双签名功能,当由实习医师、试用期医务人员书写病历时,应当经过本医疗机构注册的医务人员审阅、修改,并保留书写者与审阅者的双签名。 DCWriter提供痕迹保留、审阅标记等功能,应用系统据此实现改功能。 第二十四条第二款第一点:提供在住院病历DCWriter能在电子病历文档中插入对外部数记录中插入患者基本信息、医嘱信息、辅助据的引用。编辑器加载病历文档时能从应用检查报告、生命体征信息等相关内容的功能。 系统获得数据更新文档中的引用,从而在文档中显示应用系统中最新的数据。 第二十四条第二款第三点:提供结构化病历记录项目内容合理性检查与提示功能,包括项目独立检查和项目之间、项目与患者个人特征间的相关性检查。 第二十四条第二款第四点:提供包含展现样式的病历记录录入编辑和保存功能;提供所DCWriter提供对文档输入域的自动的和手动的数据校验功能,应用系统据此实现该功能。 DCWriter提供所见即所得的文档内容编辑界面,显示和打印结果一样

见即所得的病历记录录入编辑功能。 规范第二十四条第三款第一点:提供在住院病历记录中嵌入图片、表格、多媒体数据并进行编辑的功能。 第二十四条第三款第三点:.提供常用术语词库辅助录入功能,术语词库包括症状名称、疾病名称、药物名称、手术名称、护理常规名称等. 第二十四条第三款第四点:提供结构化(可交互元素)模板辅助录入功能,并在病历记录中保留结构化模板形成的结构。 第二十五条第一款第一点:提供病历记录的修改和删除功能,并自动保存病历记录修改的痕迹;对已确认完成的病历记录进行修改时,系统自动记录修改内容、修改人、修改时间。 第二十五条第一款第二点:对病历记录按照用户修改权限管理的功能,允许上级医务人员修改下级医务人员创建的病历记录。 规范第二十五条第二款:提供病历记录禁止修改的设置功能。 DCWriter支持在文档中插入图片、表格,表格支持单元格的任意横向合并和纵向合并,支持表格套嵌表格,支持标题行。 DCWriter的文本输入域具有下拉列表方式辅助快速录入的功能。 DCWriter支持结构化的存储,输入域的内容能和其他普通文本内容区分开来。 DCWriter支持痕迹保留功能,应用系统可以据此实现该功能。 DCWriter支持三级查房权限控制,应用系统可以据此实现该功能。 DCWriter的文本编辑器可以设置为内容只读,可以实现该功能。 第二十六条第二款第一点:提供创建结构化DCWriter支持单选、多选、必填项、填空、模板功能,结构化模板至少包含单选项、多不可修改文本等功能。 选项、必填项、填空、不可修改文本等元素。 第二十六条第二款第二点:提供模板中定义自动宏替换元素功能,宏替换元素可用于在病历记录中经常出现的患者姓名、性别、主诉等内容。 DCWriter中的输入域支持绑定到数据源,应用程序也可以编程方式设置文档输入域的内容。 第二十六条第二款第三点:提供结构化模板DCWriter支持订制的录入方式、取值范围和中,对结构化元素设定录入方式、取值范围、数据校验。 校验规则等属性功能。 第四十二条第一款:提供可浏览患者各类电子病历内容的独立软件。 第四十三条第三款第二点:提供与病历数据同时展现相关修改痕迹信息的功能,至少包括修改时间、修改人、修改内容等信息。 第四十四条第一款第一点:提供将电子病历中的各类医疗记录进行纸张打印的功能,打印格式符合卫生行政管理部门对纸质病历的相关要求。 第四十四条第一款第二点:提供电子病历记录按照最终内容(不含修改痕迹)打印的功能。 第四十四条第一款第三点:提供电子病历打应用系统在DCWriter的支持下即可实现该功能。 DCWriter支持痕迹保留功能。 DCWriter支持页面设置和打印。 DCWriter支持整洁打印。 DCWriter 支持连续打印。

印预览、接续打印功能。 第四十四条第三款第二点:提供将电子病历中的各类医疗记录以电子文件格式导出的功能。 aaaa

DCWriter能将文档保存为XML、RTF、HTML格式。 4. 开发接口

DCWriter提供非常丰富的开发接口,说明如下:

4.1. 软件模块结构

DCWriter从功能上分为如下几个功能模块。

RenderGUIFile Format ConverterRTFXMLHTMLSecurityDOMCommandsDataPrinting

在这个结构当中是以DOM为核心的,各个功能模块说明如下:

4.1.1. DOM

DOM是DCWriter的核心功能模块。它定义了文本文档对象模型,将文档中所有的内容都描述成一个个可编程对象。其中存储着大量的关键数据和关键例程。

下图就是DCWriter的DOM模块中的类型继承图。

XTextElementXTextCharElementXTextObjectElementXTextCheckBoxElementBaseXTextCheckBoxElementXTextImageElementXTextContainerElementXTextDocumentXTextContentElementXTextTableCellElementXTextDocumentContentElementXTextDocumentBodyElementXTextDocumentHeaderElementXTextDocumentFooterElementXTextFieldElementXTextInputFieldElementBaseXTextInputFieldElementXTextShapeInputFieldElementXTextBarcodeFieldElementXTextMedicalExpressionFieldElementXTextTableElementXTextTableRowElementXTextTableColumnElementXTextPageBreakElementXTextLineBreakElementXTextEOFElementXTextParagraphFlagElementXTextFieldBorderElement

通过这个图可以看出,文档中所有的内容都可以用文档元素表示,所有的文档元素都是从XTextElement类型派生出来的,由于DCWriter支持比较复杂的文档结构,因此定义了很多文档元素类型来实现所需的功能。

下图为DCWriter中DOM模块的对象组织结构图:

XTextDocumentHeaderElementsBodyElementsFooterElementsContentStylesDefaultStylesStyle0CreatorIndexDeleterIndexStyle1Style2StyleNDocumentControlerServerObjectInfoUserHistoriesHistory0History1History2HistoryNPageSettingsParametersOptionsSecurityOptionsViewOptionsBehaviorOptionsElement0StyleIndexElement1Element2ElementN

在这个DOM结构图中,XTextDocument对象是根节点,表示整个文档,是其他模块和应用程序访问DOM结构的唯一入口点。XTextDocument对象包含了很多成员,比如Body成员表示文档的正文内容,下面有若干个Element成员表示文档中的一个个片段内容。

在这个图形中带箭头的虚线表示文档元素的样式和授权控制管理信息。

EditOptions4.1.1.1. 直接操作DOM结构

开发人员可以直接编写代码操作DOM结构。往DOM树状结构添加删除内容。如下代码: XTextDocument document = myEditControl.Document ; ContentBuilder bulder = new ContentBuilder(document.Header);

DocumentContentStyle dcs = new DocumentContentStyle(); dcs.FontSize = 20; dcs.Color = System.Drawing.Color.Red; bulder.Append(\这是一段页眉 第\,dcs); XTextPageInfoElement pi = new XTextPageInfoElement(); pi.ContentType = PageInfoContentType.PageIndex; pi.StyleIndex = document.ContentStyles.GetStyleIndex(dcs); bulder.Append( pi ); bulder.Append(\共 页\, dcs); XTextPageInfoElement pc = new XTextPageInfoElement(); pc.ContentType = PageInfoContentType.NumOfPages; pc.StyleIndex = document.ContentStyles.GetStyleIndex(dcs); bulder.Append( pc ); bulder.Append(\页\, dcs); dcs = new DocumentContentStyle(); dcs.Align = DocumentContentAlignment.Center; bulder.SetParagraphStyle(dcs); bulder = new ContentBuilder(document.Body); dcs = new DocumentContentStyle(); dcs.Color = System.Drawing.Color.Yellow; bulder.Append(\这是文档正文内容\, dcs); bulder.AppendParagraphFlag(); dcs = new DocumentContentStyle(); dcs.FontSize = 40; bulder.Append(\页面第二行\, dcs); bulder = new ContentBuilder(document.Footer); dcs = new DocumentContentStyle(); dcs.FontSize = 30; dcs.Color = System.Drawing.Color.Blue; bulder.Append(\这是页脚内容\, dcs); myEditControl.Document.ContentStyles.Default.FontSize = 40; myEditControl.Document.ContentStyles.Default.Color = System.Drawing.Color.Tomato; myEditControl.RefreshDocument(); 在这里,文档对象的Header、Footer、Body属性分别表示页眉、页脚、和正文部分,都是容器元素。理论上说开发者可以直接操作容易元素的Elements列表,但操作复杂,而且容易出错。

为此DCWriter提供了一个文档内容创建器,类型为DCSoft.Writer.ContentBuidler。在这段例子代码就使用了ContentBuilder。ContentBuilder类型成员有: public ContentBuilder( XTextContainerElement container ) 对象构造函数,参数为添加内容的容器元素对象。 public DocumentContentStyle ContentStyle{get;set;}

默认文档内容样式。

public DocumentContentStyle ParagraphStyle{get;set;} 默认的段落样式。 public void Clear( )

清空内容。

public void SetParagraphStyle(DocumentContentStyle style) 设置段落样式。

public XTextElementList Append(string text, DocumentContentStyle style) 添加文档内容,第二个参数为指定的文档内容样式。 public XTextElementList Append(string text )

以默认的样式添加文档内容。

public XTextParagraphFlagElement AppendParagraphFlag(DocumentContentStyle style) 添加段落。

public XTextParagraphFlagElement AppendParagraphFlag( ) 以默认的段落样式添加段落。

public void Append(XTextElement element) 添加文档内容。

public void Append(XTextElementList elements) 添加多个文档元素对象。

4.1.2. Render

Render是文本文档内容呈现器。它负责绘制和渲染文档内容,根据DOM中的结构和数据在用户界面上和打印机上面绘制文档内容。

4.1.3. GUI

GUI是DCWriter的用户界面层。包括文本编辑器控件,一些文档元素数据编辑器等等。它是绘制文档内容的容器,此外还接受鼠标和键盘操作,调用Commands模块来访问DOM,当修改了DOM的内容后,会调用Render模块来重新绘制用户界面,更新文档视图。

4.1.4. File Format Converter

文件格式转换模块,负责将DOM中的文档数据转换为XML、RTF或HTML文档格式,也可以解析XML、RTF文档并生成DOM文档结构。

4.1.5. Commands

该模块是操作命令模块,定义了用户界面层可用的命令。这样上层应用程序不用直接操作复杂的DOM结构,而是指定名称通过命令的方式操作DOM结构。

Commands模块中还存在一个很重要的模块:应用程序宿主。它的对象类型是DCSoft.Writer.WriterAppHost。它搭建一个比较独立的后台环境,将命令功能模块、用户开发的服务器模块等等组织在一起。一般而言一个应用程序只有一个Host,当然也可以有多个Host同时运行。

WriterAppHost的主要成员有

public DCSoft.Writer.Commands.WriterCommandContainer CommandContainer{get;set;}

功能模块模块容器对象。

public System.ComponentModel.ServiceContainer Services{get;set;} 服务器对象容器。

public void AddService( Type type , object instance ) 添加服务器容器对象实例。

public WriterAppHostConfig Config{get;set;} 配置信息对象。 此外定义有静态成员

public static string GetResigerMachineCode ( )

获得注册时是用的本地机器码。 public static bool Register( string code )

进行产品注册。

public static WriterAppHost Default{get;}

默认的宿主对象,基本上都是使用本属性返回的对象实例。

编辑器控件和文档对象都具有AppHost属性来设置和返回应用程序宿主对象,通常都是返回WriterAppHost.Default指定的默认值。系统都是通过这个宿主来获得编辑器命令功能模块和用户开发的服务器对象实例。

4.1.6. Data

Data模块是管理数据的内部模块。用于实现数据源绑定。

4.1.7. 可扩展文件系统

Data模块中包括了一个可扩展的文件系统操作模块。编辑器内部使用这个文件系统来执行内部的加载和保存文档的功能。默认情况下,编辑器配置的基本的文件系统是基于本地操作系统文件的,开发者可以扩展该文件系统模块来实现将文件保存在数据库、FTP服务器或其他地方。

DCWriter中定义了一个名为DCSoft.Writer.Data.IFileSystem的接口,其定义如下: ///

/// 文件系统接口 /// /// 编制 袁永福 public interface IFileSystem { ///

/// 打开文件 ///

/// /// 打开的文件流对象 Stream Open(string fileName); /// /// 保存文件 /// /// /// 文件流对象 Stream Save(string fileName); /// /// 浏览打开文件用的文件名 /// /// /// 选择的文件名 string BrowseOpen(string initalizeFileName); /// /// 浏览保存文件时用的文件名 /// /// /// 选择的文件名 string BrowseSave(string initalizeFileName); } 开发者若要扩展文件系统,需要自己开发一个自定义类型来实现该接口,然后将自定义类型调用代码“ctl.AppHost.Services.AddService(typeof(IFileSystem), 自定义类型对象实例)”将自己开发的文件系统操作对象注册到应用系统宿主中。这样编辑器内部就可以调用开发者自定义的文件系统对象了。

4.1.8. Printing

Printing是打印相关的功能模块。

4.1.9. Security

Security是安全和授权相关的模块,是实现痕迹保留和权限等级的基础。

4.2. 文档视图的度量和坐标

DCWriter的文档视图的度量单位是System.Drawing.GraphicsUnit.Document,也就是三百

分之一英寸,而没采用和设备相关的像素单位,这样就能实现所见即所得了。

由于.NET框架中描述打印相关的度量单位就是百分之一英寸为单位,为此DCWriter的页面设置中采用是的百分之一英寸为单位的。因此文档对象的纸张大小、页边距等都是采用百分之一英寸为单位的。

默认情况下,DCWriter文档采用A4大小的纸张,也就是宽度827个单位(8.27英寸)、高度1169个单位(11.69英寸),采用纵向打印模式,页边距都是100个单位(1英寸)。页眉顶端距离纸张上边缘为50个单位(0.5英寸),页脚低端距离纸张下边缘为50个单位(0.5英寸)。

4.3. 文档内容样式开发接口

在大部分情况下,开发者想要改变文档内容,都是通过调用编辑器命令的方式来实现的,关于编辑器命令可参考后面的相关章节。

DCWriter支持复杂的文档内容样式,包括字体、颜色、边框、对齐方式等等。DCWriter中是集中管理文档样式信息,并且文档元素引用文档样式。

文档对象XTextDocument有一个签名为“public DCSoft.Writer.Dom.DocumentContentStyleContainer ContentStyles{get;set;}”的属性。该属性值就是文档内容样式容器,DocumentContentStyleContainer类型主要属性有 public DCSoft.Drawing.ContentStyle Default{get;set;}

文档默认样式,它实际上返回一个类型为DCSoft.Writer.Dom.DocumentContentStyle的对象实例。

public DCSoft.Drawing.ContentStyleList Styles{get;set;}

文档中所有样式的列表,该列表元素成员类型实际上是DCSoft.Writer.Dom.DocumentContentStyle。

DCWriter文档元素都是从XTextElement类型派生的,XTextElement类型有一个签名为“public virtual int StyleIndex{get;set;}”的属性,该属性值就是其引用的文档样式编号,因此可以使用代码“document.ContentStyles.Styles[ element.StyleIndex]”获得文档元素引用的文档内容样式;若StyleIndex为-1或者其他不合理的值,则文档元素引用默认样式,也就是document.ContentStyles.Default的值。

注意:当文档在一个编辑器控件中显示和编辑时,文档的默认字体就自动设置为编辑器控件的字体;文档的默认文本颜色就自动设置为编辑器的前景色。这个过程是自动的,外界即使修改了文档的默认属性也是没有用的。

XTextElement类型有一个签名为“public DocumentContentStyle Style{get;set;}”的属性就是返回改文档元素引用的内容样式对象。

文档元素在实际使用文档内容样式时不会直接使用其引用的文档样式,而是先将文档样式和文档默认样式进行合并,再使用它。为此XTextElement类型有一个签名为“public DocumentContentStyle RuntimeStyle{get;}”的属性来返回这个运行时实际使用的文档样式。

DocumentContentStyle类型主要属性有 背景相关属性

public System.Drawing.Color BackgroundColor{get;set;}

背景色。默认为透明色。

public DCSoft.Drawing.XImageValue BackgroundImage{get;set;} 背景图片。

public System.Drawing.ContentAlignment BackgroundPosition{get;set;}

背景对齐方式。

public float BackgroundPositionX{get;set;} 背景X轴方向偏移量。

Public float BackgroundPositionY{get;set;} 背景Y轴方向偏移量。

public bool BackgroundRepeat{get;set;} 是否重复绘制背景。 文字相关属性

public System.Drawing.Color Color{get;set;} 文字颜色。

public DCSoft.Drawing.XFontValue Font{get;set;} 字体。

public string FontName{get;set;}

字体名称,默认为系统默认字体名称。 public float FontSize{get;set;} 字体大小,默认为9。 public bool Italic{get;set;} 斜体,默认为false。 public bool Underline{get;set;} 下划线,默认为false。 public bool Strikeout{get;set;} 删除线,默认为false。 public bool Bold{get;set;} 粗体。

public bool Superscript{get;set;} 上标样式,默认为false。 public bool Subscript{get;set;} 下标样式,默认为false。 public float Spacing{get;set;} 字符间距,默认为0。 边框相关属性

public bool BorderLeft{get;set;}

是否显示左边框线,默认为false。 public bool BorderTop{get;set;} 是否显示上边框线,默认为false。 public bool BorderRight{get;set;} 是否显示右边框线,默认为false。 public bool BorderBottom{get;set;} 是否显示下边框线,默认为false。 public float BorderWidth{get;set;} 边框线粗细,默认为0。

public System.Drawing.Drawing2D.DashStyle BorderStyle{get;set;} 边框线样式,默认为Solid。 public float BorderSpacing{get;set;}

边框线间距,默认为0,仅适用于段落。 public float PaddingLeft{get;set;} 左内边距,默认为0。 public float PaddingTop{get;set;} 上内边距,默认为0。

public float PaddingRight{get;set;} 右内边距,默认为0。

public float PaddingBottom{get;set;} 下内边距,默认为0。 段落相关属性

public bool BulletedList{get;set;} 段落是否采用圆点式列表方式。 public bool NumberedList{get;set;}

段落是否采用数字式列表方式。

public DCSoft.Drawing.DocumentContentAlignment Align{get;set;} 段落对齐方式。可选值有Left,Center,Right,Justify,默认为Left。 public float SpacingBeforeParagrah{get;set;}

段落前间距,默认为0。

public float SpacingAfterParagraph{get;set;} 段落后间距,默认为0。 public float LineSpacing{get;set;} 行间距。

public DCSoft.Drawing.LineSpacingStyle LineSpacingStyle{get;set;} 行间距样式,它决定了LineSpacing属性值的意义,其可选值为 SpaceSingle Space1pt5 SpaceDouble SpaceExactly SpaceSpecify 单倍行距,此时LineSpacing值无意义。 1.5倍行距,此时LineSpacing值无意义。 双倍行距,此时LineSpacing值无意义。 最小值,此时LineSpacing值无意义。 固定值,此时LineSpacing指定了行间距。 注意在DCWriter中,行间距是文本行的上边缘和下行的上边缘之间的距离,而不是本行下边缘和下一行上边缘之间的距离,因此算是行高。 多倍行距,此时LineSpacing指定的倍数。 public DCSoft.Drawing.VerticalAlignStyle VerticalAlign{get;set;} 文本垂直对齐方式。仅适用于表格单元格。 public float FirstLineIndent{get;set;} 段落首行缩进量。

public float LeftIndent{get;set;} 段落左缩进量。 授权相关

public int CreatorIndex{get;set;}

创建文档内容的创建者历史记录编号,默认为-1。 public int DeleterIndex{get;set;} 删除文档内容的删除这历史记录编号,默认为-1。

SpaceMultiple

4.3.1. 修改文档样式

由于具有运行时的文档样式,因此当应用程序只是修改了文档的默认样式,则整个文档所有元素的样式也会随着更换。

由于采用样式列表引用的方式来设置文档元素的样式,因此不能直接修改文档元素的样式设置,例如执行“element.Style.Bold = true”这样的代码是错误的。而是需要执行以下代码: DocumentContentStyle style = new DocumentContentStyle(); style.Bold = true; element.Style = style; 也就是开发者不能直接设置元素的element.Style下面的设置,而必须创建一个新的DocumentContentStyle对象,然后设置它的值,最后将其设置到文档元素的Style属性值上。而且这种方法运行速度快,但只是更新了文档DOM结构,最后还必须调用编辑器控件的RefreshDocument方法更新文档视图,而且不能调用Undo/Redo命令重复和撤销操作。

4.4. 权限和痕迹保留开发接口

DCSoft.Writer支持文档内容等级权限控制。在打开文档后用户可以在编辑器中执行登录操作,每一次用户登录都系统都记录用户名和用户授权等级。此时新增、修改或逻辑删除的内容都归于当前用户名下。 操作控制

对于开发人员来说,用户授权等级就是一个整数,该数值越大,用户等级越高。在一篇文档内部,高等级用户制造的文档内容对低等级的用户来说是只读的,只能看不能修改。而低等级用户制造的文档内容高等级用户是可以查看和修改、删除的。 可视化显示

另外编辑器还能可视化的显示用户操作痕迹。对于等级小于等于0的用户,其内容正常显示;对于权限等级为1的用户,其插入的文档内容使用蓝色的单下划线来突出显示,其逻辑删除的内容使用红色的单条删除线来突出显示;对于权限等级大于等于2的用户,其插入的内容使用蓝色双下划线来突出显示,其逻辑删除的内容使用红色的双删除线来突出显示。

当鼠标停留在到文档内容上时,会显示一个提示标签,说明文档内容的创建信息和被逻辑删除的信息。

这样文档的权限控制从传统的文件级别深入到文档内部,这成为电子病历应用系统实现三级查房功能的技术基础。相信其他行业应用也可能存在类似的需求。 权限及痕迹数据的存储

应用程序可以通过DCSoft.Writer提供的DOM结构直接访问权限和痕迹信息。

文档对象是DCSoft.Writer.Dom.XTextDocument类型,它具有以下和痕迹和权限相关属性:

public DCSoft.Writer.Dom.DocumentContentStyleContainer ContentStyles{get;set;}

整个文档都使用的文档内容样式容器。该对象的Styles属性就是一个文档样式列表,其列表元素类型是DCSoft.Writer.Dom.DocumentContentStyle。该类型中权限相关的属性有

public int CreatorIndex{get;set;} 创建该文档元素的用户历史记录编号。系统使用该编号在文档对象的UserHistories列表中检索用户登录操作历史记录对象。

public int DeletorIndex{get;set;} 逻辑删除该文档元素的用户历史记录编号。 public DCSoft.Writer.Security.UserHistoryInfoList UserHistories{get;set;} 用户登录操作记录列表。它是一个列表,其最后一个元素就是当前用户登录历史记录。该列表元素类型为DCSoft.Writer.Security.UserHistoryInfo。UserHistoryInfo类型的属性有

int Index{get;set;} 记录编号。 string ID{get;set;} string Name{get;set;} DateTime SavedTime{get;set;} int PermissionLevel{get;set;} string Description{get;set;} string Tag{get;set;} 登录用户编号。 登录用户名。 保存文档的日期时间。 用户授权等级。 用户登录时附加的说明文字。 扩展数据。 文档中所有的元素都派生自DCSoft.Writer.Dom.XTextElement类型,该类型具有一个签名为“public int StyleIndex{get;set;}”的属性,系统就根据这个属性值在文档对象的ContentStyles.Styles列表中检索文档样式对象。

由于已经有了这些数据,编辑器软件就通过以下流程查找权限信息。

1. 获得文档元素对象(都是派生自XTextElement类型)的StyleIndex属性,检索文档对象

的ContentStyles.Styles列表,也就是通过代码“document.ContentStyles.Styles[ element.StyleIndex ]”获得文档样式对象。

2. 根据文档样式对象的CreatorIndex检索文档对象的UserHistories列表,也就是通过代码

“document.UserHistories[ style.CreatorIndex 或 style.DeletorIndex ]”获得用户登录历史记录信息对象。

3. 获得了文档历史记录对象的PermsissionLevel值,也就是创建或者逻辑删除该文档元素

的用户权限等级,然后跟当前用户权限等级进行比较。若大于当前等级,则当前用户无法修改该文档元素;若小于等于当前的等级,则当前用户可以修改或者删除该文档元素。

也就是说编辑器通过element.StyleIndex →document.ContentStyles.Styles →document.UserHistories这样的查询路径获得文档元素的授权信息。此时应用系统也可以通过这样的路径直接访问文档中的权限及痕迹保留信息。

启用权限控制

要应用文档内容等级权限控制,首先要启用授权控制,需要设置编辑器的以下属性 ctl.DocumentOptions.SecurityOptions.EnablePermission

是否启动文档内容等级权限控制,这是最基础的属性。 Ctl.DocumentOptions.SecurityOptions.EnableLogicDelete

是否启用逻辑删除功能。一般的用户功能需求都需要设置该属性。 ctl.DocumentOptions.SecurityOptions.ShowLogicDeleteContent

是否显示被逻辑删除的内容。这个视用户需求而设置。 ctl.DocumentOptions.SecurityOptions.ShowPermissionMark 是否显示用户痕迹标记。 用户登录 启用编辑器的权限控制后,应用程序通过两种模式进行登录。 1.自动登录。

应用程序设置编辑器控件的AutoUserLogin属性为true,这样启用自动登录,然后设置

编辑器控件的AutoUserLoginInfo属性值,定义好自动登录时的用户信息。

AutoUserLoginInfo属性值是DCSoft.Writer.Security.UserLoginInfo类型。该类型的属性有 string ID{get;set;} 用户登录号。 string Name{get;set;} int PermissionLevel{get;set;} string Description{get;set;} string Tag{get;set;} 用户名。 用户权限等级。该数值越高,用户权限等级越高。 用户此次的登录的说明信息。供应用程序使用,编辑器内部不使用。 扩展信息。供应用程序使用,编辑器内部不使用。 当设置好自动登录后,编辑器控件每次加载文档后就会自动登录,将指定的用户信息添加到文档中并设置为当前用户。 2.应用程序登录。

应用程序设置编辑器控件的AutoUserLogin属性为false,这样就需要应用程序登录了。应用程序在调用编辑器控件的LoadDocument方法加载文档后,或者响应编辑器控件的DocumentLoad事件来进行登录。

应用程序调用编辑器控件的UserLogin方法执行登录。通过这个方法来传递用户名、授权等级等登录信息。

4.5. 文本编辑器控件

DCWriter的GUI模块的核心就是文本编辑器控件,该控件类型为DCSoft.Writer.Controls.WriterControl。它是一个WinForm控件,并且是COM公开的。

该控件常用的成员有

public bool AllowDragContent{get;set;} 能否直接拖拽文档内容,默认为false。

Public bool IsCommandEnabled( string commandName )

判断指定名称的编辑器功能命令在当前是否可用。注意:调用这个函数只是返回命令状态,不会自动设置该命令绑定的按钮或菜单栏的状态。 Public bool IsCommandChecked( string commandName ) 判断指定名称的编辑器功能命令在当前是否处于勾选状态。注意:调用这个函数只是返回命令状态,不会自动设置该命令绑定的按钮或菜单栏的状态。

Public object ExecuteCommand( string commnadName , bool enableUI , object parameter ) 执行指定名称的编辑器功能命令。第一个参数指定命令名称,第二个参数为是否允许显示用户界面,第三个参数为用户指定的额外参数。 Public event CommandEventHandler CommandError

执行编辑器功能命令时出错时的事件。

Public virtual void OnCommandError( WriterCommand cmd , WriterCommandEventArgs cmdArgs , Exception exp ) 处理在执行编辑器功能命令时抛出的异常。 Public DateTime LastUIEventTime

最后一次用户界面事件的发生时间,用户界面事件包括鼠标键盘事件、OLE拖拽事件。应用程序可以根据这个属性值来实现超时锁定用户界面的功能。 Public bool Readonly{get;set;}

控件内容是否只读。

Public bool HeaderFooterReadonly{get;set;} 控件中显示的文档的页眉页脚内容是否只读。 Public string LicenseFlag{get;set;}

控件授权信息标记。

Public DCSoft.Writer.Controls.FormViewMode FormView{get;set;} 控件的表单视图模式。可选值有

Disable:不处于表单视图模式,用户可任意编辑。

Normal:处于普通表单视图模式,用户可以编辑输入域中的内容,输入域之外的内容只读,但可以选择。

Strict:严格的表单视图模式,可以可以编辑输入域中的内容,但输入域之外的内容只读,而且不可选项,插入点不可在输入域之外。

Public bool Modified{get;set;}

控件中文档内容是否被改变的标志。 Public object ServerObject{get;set;} 用于”Server”文档变量和脚本中的变量的对象实例。

Public DCSoft.Writer.DocumentOptions DocumentOptions{get;set;}

文档设置。

Public DCSoft.Writer.Dom.XTextDocument Document{get;set} 在控件中显示和编辑的文档对象。 Public int DocumentContentVersion{ get;} 当前文档内容的版本号,对文档内容的任何修改都会使得该版本号增加。 Public int WriteDataSource()

将文档输入域中的表单数据写入到文档对象绑定的数据源中。函数返回填写的数据条数。

Public DCSoft.Writer.Dom.DocumentControler DocumentControler{get;set;}

文档控制器。

Public bool IsAdministrator{get;set} 是否已管理员模式运行。

Public DCSoft.Writer.WriterAppHost AppHost{get;set;} 应用程序宿主对象。

Public void Move( DCSoft.Writer.MoveTarget target )

将插入点移动到指定位置。

Public DCSoft.Writer.Dom.DocumentContentStyle CurrentStyle{ get;} 当前文档样式。

Public DCSoft.Writer.Dom.XTextElement CurrentElement{get;} 获得当前插入点所在的文档元素对象。

Public DCSoft.Writer.Dom.XTextElement GetCurrentElement( Type elementType ) 获得插入点所在的指定类型的文档元素对象。

Public DCSoft.Writer.Dom.XTextElement HoverElement{get;} 当前鼠标光标下的文档元素对象。

Public DCSoft.Writer.Dom.XTextLine CurrentLine{get;} 当前插入点所在的文本行对象。

Public DCSoft.Writer.Dom.XTextElement GetElementById( string id );

获得指定ID号的文档元素大小,查找时ID值区分大小写。

Public DCSoft.Writer.Dom.XTextElementList GetSpecifyElements( Type elementType) 获得文档中所有的指定类型的文档元素列表。

Pulbic DCSoft.Writer.Dom.HighlightInfo HighlightRange{get;set;} 获得或设置文档中的高亮度显示区域。

Public DCSoft.Writer.Dom.HighlightInfoList HighlightRanges{ get;set;} 获得或设置文档中的多个高亮度显示区域。

Public DCSoft.Writer.Dom.XTextContentRender ContentRender{ get;set;} 获得或设置文档内容呈现器。 Public bool AutoUserLogin{get;set;}

每次打开文档时是否自动进行用户登录。

Public DCSoft.Writer.Security.UserLoginInfo AutoUserLoginInfo{get;set;} 执行自动登录时使用的用户登录信息。

Public bool UserLogin( string userID , string username , int permissionLevel )

执行用户登录,第一个参数为用户编号;第二个参数为用户名;第三个参数为用户授权登记。

Public bool UserLogin( UserLoginINfo loginInfo , bool updateUI )

执行用户登录,第一个参数为用户登录信息;第二个参数为是否更新用户界面。 Public bool LoadDocument( string fileName , DCSoft.Writer.FileFormat format ) 从指定的文件已指定的格式加载文档。

Public bool LoadDocument( System.IO.Stream steram , DCSoft.Writer.FileFormat format) 从指定的流中以指定的格式加载文档。 Public event EventHandler DocumentLoad 文档加载成功事件。

Public virtual void OnDocumentLoad( EventArgs args )

出发文档加载成功事件。

Public bool SaveDocument( string filename , FileFormat format ) 以指定的格式将文档保存在指定的文件中。 Public void ClearContent() 清空文档内容。

public void RefreshDocument() 属性文档视图。

Public override string Text{get;set;} 纯文本格式的文档内容。 Public string RTFText{ get;set;}

RTF格式的文档内容。 Public string XMLText{get;set;} XML格式的文档内容。

Public bool EnableJumpPrint{get;set;} 是否允许续打。

Public int JumpPrintPosition{get;set;} 设置和获得续打位置。

Public event EventHandler HoverElementChanged 鼠标悬停的元素发生改变事件。

Public virtual void OnHoverElementChanged( XTextElement oldHoverElement , XTextElement newHoverElement )

触发鼠标悬停的文档元素发生改变事件。第一个参数为旧的鼠标悬停元素,第二个参数为新的鼠标悬停元素。

Public bool HideCaretWhenHasSelection{get;set;} 当选择了文档内容时是否隐藏插入点光标。 Public void SelectAll() 选择文档中所有的内容。 Public void Cut() 执行剪切操作。 Public void Copy() 执行复制操作。 Public void Paste() 执行粘贴操作。 Public void Undo() 执行撤销操作。 Public void Redo()

执行重复操作。

Public void DeleteSelection() 删除被选中的文档内容。 Public int CurrentColumnIndex 获得从1开始计算的当前列号。 Public int CurrentLineIndex 获得从0开始的当前行号。 Public int CurrentLineIndexInPage

获得从1开始计算的当前文本行在页中的序号。 Public DCSoft.Writer.XTextSelection Selection 文档中被选中的部分内容。 Public void PrintDocument() 打印整个文档。

Public void PrintCurrentPage() 打印当前页。

Public event EventHandler DocumentContentChanged 文档内容发生改变事件。

Public event EventHandler SelectionChanged

插入点或文档内容被选择状态发生改变事件。

Pulbic event SelectionChangingEventHandler SelectionChanging 插入点或文档内容被选中状态正在发生改变事件。这个事件是可以撤销的。 Public bool IsEditingElementValue{get;} 控件正在弹出一个用户界面编辑输入域的内容。 Public bool CancelEditElementValue() 取消编辑输入域内容的操作。

Public bool BeginEditElementValue( XTextElement element , bool detect ) 开始执行编辑元素内容的操作。第一个参数为文档元素对象;第二个参数为指示本次调

用只是检测当前元素的值能否编辑,但不执行编辑操作。 Public string PageTitle{get;} 页面标题。

Public string StatusText{get;set;}

状态栏文本。

Public void SetStatusText( string text ) 设置状态栏文本。

Public event EventHandler StatusTextChanged 状态栏文本发生改变事件。 Public void ShowAboutDialog()

显示关于对话框。

4.5.1. WinForm开发

编辑器控件可以用于WinForm应用程序开发。其过程和其他WinForm控件没多大差别。也就是将控件添加到WinForm窗体设计器的控件工具条上,然后拖拽一个控件到窗体上即可使用。

4.5.1.1. 数据交换

DCWriter编辑器控件通过两种方式和其他应用程序交换数据,包括系统剪切板和OLE拖拽。

4.5.1.1.1. 系统剪切板

编辑器控件支持复制数据到Windows系统剪切板和从Windows系统剪切板粘贴数据。当编辑器控件复制数据到剪切板时,复制的数据是多格式的,包括 1. 纯文本格式。

2. 自定义的内置XML字符串格式,该格式名称为“DCWriterXML V:编辑器版本号”,例如

“DCWriter V:1.1.23.3424”。该格式的数据就是一段能用于加载文档的XML字符串。 3. HTML文档格式。 4. RTF文档格式。

5. 当复制的文档内容是一个图片文档元素时,还输出图片格式。

编辑器从系统剪切板粘贴数据时,编辑器以此支持以下格式:

1. 文件名。当数据为一个文件名,而且指向的文件名的扩展名

为.bmp、.png、.jpg、.jpeg、.gif、.emf。则认为它是图片文件。编辑器会加载文件并向文档插入一个图片元素。

2. 位图对象。如果数据为一个位图对象,则编辑器会据此向文档插入一个图片元素。 3. 系统内置XML格式。编辑器会以XML的格式加载文档并将其内容插入到当前文档中。 4. RTF文档。 5. 纯文本。

编辑器在粘贴数据时会调用数据过滤器。关于数据过滤可参看后续相关章节。

编辑器配置Copy命令用于复制数据到系统剪切板,配置Cut命令执行剪切操作,配置Paste命令用于粘贴系统剪切板中的数据,配置SpecifyPaste命令用于进行选择性粘贴。

剪切和粘贴操作对文档内容带来的影响都可以使用Undo、Redo命令来重做和撤销。

4.5.1.1.2. OLE拖拽

编辑器控件支持OLE拖拽操作。当编辑器控件的AllowDrop属性值为true,则支持OLE拖拽将数据复制到文档中;当编辑器控件的AllowDragContent数值为为true时,则支持OLE拖拽操作将数据复制或者移动到编辑器的其他部分或者其他程序中。

在执行OLE拖拽操作时,用户按下Ctl键则执行OLE拖拽复制操作,否则执行OLE拖拽移动操作。

OLE拖拽操作支持的数据格式和使用系统剪切板时支持的数据格式一样。

目前版本的DCWriter编辑器有一个已知的缺陷,那就是在同一个编辑器中执行OLE拖拽移动操作后,需要执行两次Undo命令才能完全撤销操作。

4.5.1.2. 数据过滤

编辑器控件支持数据过滤,从数据插入到编辑器的文档中时,开发者可以编程对数据进行过滤。这里的外界数据包括粘贴所得的数据、OLE拖拽所得的数据、用户手工输入的文档数据或者应用程序调用编辑器命令插入的数据。

DCWriter定义了一个签名为“public delegate void FilterValueEventHandler( object sender , FilterValueEventArgs args )”的委托。开发者只要创建一个委托对象,然后添加到AppHost中即可启用。

这个委托的第二个参数类型为DCSoft.Writer.Dom.FilterValueEventArgs,它的成员有: public DCSoft.Writer.Dom.InputValueSource Source{get;set;} 数据来源,可选值有

Clipboard:数据来自Windows系统剪切板。 UI:数据来自用户界面的用户输入。 Unknow:未知。

public string SourceName{get;set;}

数据来源的名称。

public InputValueType Type{get;set;}

数据类型,可选值有:

Text:纯文本数据。 RTF:RTF文档数据。 Image:图片数据。 FileName:文件名。

Dom:DCWriter文档DOM数据。

public object Value{get;set;} 要处理的数据。

public bool Cancel{get;set;}

取消相关数据操作的标记。

开发者可以使用以下代码来实现数据过滤: //使用这行代码来注册启动数据过滤器 ctl.AppHost.Services.AddService( typeof(DCSoft.Writer.Dom.FilterValueEventHandler ), new DCSoft.Writer.Dom.FilterValueEventHandler(MyFilterData)); // 数据过滤代码 private void MyFilterData(object sender, FilterValueEventArgs args) { 用户代码。 } 这样开发者就能实现数据过滤功能,比如在电子病历中,只能同一个人的病历之间的文本可以复制粘贴,而不同人的病历文本是不能粘贴的。使用数据过滤就能实现这个功能。

4.5.2. WPF开发

编辑器控件可以用于WPF开发。以下XAML代码即可将一个编辑器控件添加到WPF窗体中: