文檔對象模型
在實際開發時不必挨個解決問題,我是首先確定文檔對象樹的結構,這裡使用了文檔對象模型的概念,其實我們已經碰到很多種文檔對象模型,最多的莫過於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屬性,用於表示對象在的位置和顯示大小
◆RealLeft , RealTop 只讀屬性,表示對象在視圖區域中的顯示位置
◆RefreshSize 方法,用於重新計算對象的顯示大小
◆RefreshVIEw 方法,重新繪制對象
◆andleMouseDown 方法,處理鼠標按鍵按下事件
◆HandleMouseMove 方法,處理鼠標移動事件
◆HandleMouseUp 方法,處理鼠標按鍵松開事件
◆FromXML 方法,從一個XML節點加載對象數據
◆ToXML 方法,向一個XML節點保存對象的所有的數據
由於文檔內容是分層次的,因此還定義一個容器類型TextContainer,該類型從TextElement派生的,其中進行擴展來可以保存若干個子對象,它定義了以下虛成員:
◆MaxWidth 屬性,對象內容的最大寬度,一個文檔顯示寬度就是紙張寬度減去左右頁邊距的距離,文檔所有的內容被限制在這個顯示寬度中間,該屬性和顯示寬度有關
◆ChildElements 只讀屬性,返回所有子對象的集合,返回類型為System.Collections.ArrayList
◆AppendChild 方法,該方法參數為一個TextElement對象,本方法將該對象添加到子對象集合中
◆RemoveChild 方法,該方法參數為一個TextElement對象,本方法從子對象集合中刪除指定的文檔元素對象
◆RemoveChildRange 方法,該方法和RemoveChild類似,只是用於刪除一批子對象
◆InsertBefore 方法,該方法參數為兩個TextElement對象,第一個參數為要新增的文檔元素對象,第二個為插入點所在的文檔元素對象