程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 如何用C#編寫文本編輯器(6)

如何用C#編寫文本編輯器(6)

編輯:關於C語言

訪問數據庫

由於應用需要,本文本編輯器要直接訪問數據庫,但該文本編輯器既使用於C/S程序又使用於B/S程序,當處於B/S構架時是不好直接連接數據庫的,必須通過服務器程序來訪問數據庫。為了編程方便,應該抹殺掉這兩種模式之間的差別。

大家考察一下.NET框架中操作數據庫的類型,可以發現無論是專門操作SQLServer的在System.Data.SqlClIEnt名稱空間下面的那套對象還是操作OLEDB的在System.Data.OleDb空間下面的那套對象(其他類似有專門操作ODBC和Oracle),這些套對象間最大的共同點就是都遵循一套在名稱空間System.Data下接口。這些接口包括IDataReader , IDbCommand,IDbConnection,IDbDataParameter, IDataParameterColleciton等等 。若我們編了一套對象也實現了這些接口,那就相當於自定義了一套.Net數據庫驅動程序。於是小弟很快根據B/S構架特性寫了套對象,該套對象通過HTTP協議和WEB服務器交流數據,這套對象將SQL語句及其參數簡單打包使用POST方法發送到指定的服務器頁面後等待返回,服務器頁面解析出SQL語句和參數查詢數據庫,將查詢所得結果經過一定的編碼返回為客戶端,而客戶端根據HTTP返回結果進行一番處理後就可以使用一個實現IDataReader的對象來訪問了。這樣在應用程序的其他模塊若查詢數據庫則只要堅持使用System.Data.IDbConnection 等接口就可以了,如此就抹殺了C/S和B/S環境下訪問數據庫的差別了。

這種模式也算是一種WebService了,服務器頁面可以使用任何類型,可以使用ASP,ASP.Net,PHP,J2E或JSP等等,只要能解析出SQL語句並返回特定結構的數據就行了。小弟的服務器為J2E,偶Java不熟,勉強用JSP實現了一個。我管這種模式叫兩層半,實踐證明這套還是管用的。

派生對象

定義了基礎對象後就開始派生對象了,首先定義字符對象類型TextChar,一個文檔內容中最主要的還是字符數據,在此為了實現方便,文檔中每一個字符都是一個字符對象,字符對象重載了RefreshSize對象RefreshSize方法,用於根據當前繪制用的繪圖對象(System.Drawing.Graph對象)的MeasureString來計算文字大小。注意默認情況下,該方法計算的字符串顯示寬度後回額外的附加一些空白,為了計算實際的大小則使用System.Drawing.StringFormat.GenericTypographic參數。此外還有一個比較特殊的字符-制表符。這個字符的寬度是不固定的,需要在進行排版的時候才計算。

字符對象(TextChar)還派生RefreshVIEw方法,該方法比較簡單,根據Left,Top值進行坐標轉換後算出繪制地點,然後調用System.Drawing.Graph.DrawString方法即可。字符對象還定義了自己的成員,比如Char屬性返回對象表示的字符數據,Font表示繪制對象使用的字體,ForeColor表示繪制文本的顏色。

字符中的制表符比較特殊,因為它的寬度是不定的,而是根據它在文檔視圖中的位置而定的,因此在TextChar上在派生TextCharTab來轉變處理這種情況,它新增了RefreshTabWidth方法,來根據對象在視圖區域中的左端位置計算字符寬度。在此處我認定一個制表符步長等於四個下畫線字符的寬度,制表符的右端坐標必須是制表符步長的自然數倍,因此根據制表符的位置來進行取模操作和其他操作就可以計算制表符的寬度。

為了表示段落而定義了段落對象TextParagraph,該對象不是容器對象,保存了段落對齊方式的信息,該元素的顯示樣式類似於Word中的段落符(硬回車)的樣式。

還定義了行結束對象TextLineEnd,該對象模擬了Word的分行符(軟回車)。

可以定義圖片對象,經過對Word處理文檔的行為觀察,可以發現在Word文檔中插入的圖片和OLE對象特性很相似,因此為了考慮文本編輯器的可擴展性,首先在TextElement的基礎派生出TextObject抽象類,該抽象類表示一個在文檔中的對象,該對象由其派生的類決定。

在TextObject對象派生出TextImage表示一個圖片對象,該對象重寫了RefreshVIEw方法,用於在繪圖輸出對象上繪制一個圖片。還重載了FromXML和ToXML方法來和XML節點交換數據,可以設計將圖片二進制數據以Base64格式保存為XML節點下。

此外還可以根據應用的需要從TextObject對象上派生其他的類型,比如直接讀取數據庫在界面上繪制曲線圖等等,此時文檔中的該對象可以動態的展示系統中最新的數據。

圖形化用戶界面

可以觀察到Word中的對象(包括圖片)可以改變大小,當用鼠標點擊圖片對象時,圖片四個角和四個邊的中點上會顯示8個小點。這些小點我稱為控制點。用鼠標拖拽這8個點可以動態的改變對象的大小。其實在很多類型的程序中可以碰到這8控制點,例如在VS.Net的窗體設計器中,當前的控制周圍就有這8個控制點。關於如何實現這8個控制點也是有一套的。

控制點可以分為內控制點和外控制點兩種類型,我們對這8個點進行從0到7的編號。當鼠標光標移動到這8個控制點上方時需要設置為不同的光標樣式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved