Scintilla! 一個超棒的免費源代碼編輯控件

Scintilla是一個免費的源代碼編輯控件,它完全開放源代碼,並且提供一個license允許用戶自由地將它用在開源軟件或是商業軟件中。


我是在做畢業課題的時候發現的這個編輯控件,使用後發現它實在是強大和穩定,作爲源代碼編輯控件,我們能在普通的的文本編輯控件中能看到的功能,Scintilla都完全能夠實現,而且,它還能夠提供很多編輯和調試源代碼時有用的特殊功能。包括語法高亮顯示,錯誤指示,代碼自動完成以及代碼提示等。而且在左邊的空白處(margin),可以顯示調試代碼中非常有用的顯示斷點以及顯示當前運行行等功能。而且,自定義風格的功能比其他大部分編輯器控件都開放,它允許用戶自定義不同類型下的字體,是否粗體,是否斜體,前景色和背景色,支持大量的字體。舉個例子,在設置C/C++編輯模式後,你可以定義註釋語句類型的顏色,字體,大小等等,同樣,可以自定義關鍵字類型的顏色,字體,大小……諸如此類,這樣給用戶極大的配置的自由。


據Scintilla的網站上發佈的消息,Scitilla將在以後的開發中,更加靈活,健壯,更好地表現在.Net和java虛擬機中運行,就這一點,可以看出Scitilla項目就是一個非常有活力的項目,其開發團隊對它非常有激情,這也使我們——這些用戶從中受益。


據作者介紹,開發Scintilla的動機是來自他對Richedit的失望,在Richedit中,樣式的改變被看作是文檔的一種改變,從而會被記錄到undo的堆棧中,並且設置的文檔對象的修改標記。這對源代碼編輯是非常不合適的,改變關鍵字類型的顏色或是運算符的顏色,這不應該看作是文檔的修改,也不應該能夠通過undo/redo來返回/前進。我對此深有感觸,如果是Richedit來做源代碼編輯的控件,那將有太多的東西需要自己編寫代碼實現了,選擇Scintilla,將是一個明智的選擇,省時,省力,安全,可靠。


Scintilla目前提供了Win32版本和Linux版本。在Linux中使用的是GTK+,已經在Windows95,nt4.0, Windows2000, windows XP以及RedHat Linux8和9中的GTK+1.2和2.0中測試運行正常。這是一個跨平臺的控件,也是我對其非常欣賞的原因之一。下面我的主要論述的還是在windows + VC下如何使用這個控件,但是其他平臺/編譯工具下也大同小異,觸類旁通吧。

 

簡介:

 

Scintilla的windows版本就是一個窗體控件。它的主要編程接口是通過窗體消息來傳送的。你要實現什麼功能,向控件發送一個消息就可以了,當需要從控件得到什麼信息,接受WM_NOTIFY消息即可,可以從它帶的參數中獲得大量當前控件的信息,比如是否已經修改文字了,是否正在點擊左邊的邊框等等。但是,實際上在MFC編程中,通過消息的方式來控制控件還是非常麻煩的,因爲這些消息的大部分都是自定義消息,不便於記憶。所以一般的做法就是將這些消息的調用封裝成一個窗體類,這樣調用方便多了。除了能實現一般編輯控件能實現的功能外,scintilla還能實現語法高亮,代碼摺疊,書籤,自動完成,語句提示等等功能。你完全可以不用學習標準編輯控件CEDIT或者是RichEdit,scintilla提供了協調一致的API口,這些都是它的優點之處。

事實上,scintilla開發組同時也用這個控件開發了一個編輯軟件SciTE,它百分百的實現了scintilla的全部功能,如果你對scintilla非常感興趣,但又不知它到底能做到那些功能的活,當一個SciTE,使用一下就完全明白了。同時,SciTE也是開源軟件,學習它的代碼,就是學習scintilla的使用方法。在scintilla的文檔中,就說明了,這個文檔只是獨立地講解各個消息的使用方法,功能和參數,並不能講解如何把它們連接起來組成一個實用的編輯器,要想知道如何實現某些特定功能,還是看看SciTE是如何實現的。我也看過SciTE的代碼,可讀性還是不錯的,可惜我是沒有耐心的人,也就讀了幾個函數,大體瞭解了一下,如果你想用好這個控件,多讀讀SciTE的源碼還是不錯的。

scintilla的消息就用SendMessage函數發送,它提供兩個頭文件:Scintilla.h和SciLexer.h,消息號的宏定義都在這裏,而且還有很多要用到的結構體,類型等等的定義。消息帶的兩個參數wParam和lParam是要經常用到的,也許會用到一個,兩個,或者無需參數。但建議你最好在使用的時候把不用的參數都賦予0值,因爲如果以後擴充消息功能,用到了某個參數,賦值能防止程序的崩潰。

通常參數的類型如下:
bool int const char* char* colour <unused>

其他的類型不用多說,至於color類型,是用於描述顏色的,它實際上就是一個整數,計算方法是:red|(green << 8)|(blue << 16), red,green,blue是8位2進制數,也就是2位16進制數。很容易就能實現256色的調配。至於<unused>,就是說這個參數在這個消息中不用,可以賦爲0值。

下面的講解的重點是放在VC+MFC的環境中,因爲我一直在這個環境下開發東西,要是用SDK編程也一樣的,只是用到了更多的API,至於編譯器,VC也好,GCC也好,我覺得沒什麼大問題,我就曾經用GDB調試SciTE的源碼,來了解scintilla如何使用的,Linux平臺下的GTK+編程我沒嘗試過,從文檔上看,也是用消息的方式來控制控件,用接受消息的方式來獲得控件的信息。


下面我就如何封裝scintilla成爲一個窗體類,如何在程序中使用它的功能一一講解,水平有限,而且現在還在上學中,可能寫得比較慢,呵呵,諒解。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章