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 >