很多ide或者開發工具中都有語法著色的功能,這是如何實現的呢?筆者試著用c#做了乙個sample,基本上實現此功能。
本文一半是原創,一半是參考國外的論壇
語法著色器,實際上只做了兩件事情:「接受使用者輸入」以及「改變關鍵字字型屬性」。
c#自帶的控制項中能夠滿足需求的首推「richtextbox」,筆者在網上經常看到很多同行都以此為基礎,製作出類似ms-word的種種效果。既然,複雜的word效果都能夠實現,那麼語法著色自然也就不在話下。
這一點還可分成三個更小的工作:關鍵字列表、判斷關鍵字、定義字型屬性。
關鍵字列表很簡單,乙個list即可滿足需求。
這裡以基本sql語句為例。
private ilist_keywords = new list()判斷關鍵字;
為了在使用者輸入時能夠立即對所輸入的內容有所反映,我們需要override一下richtextbox的ontextchanged()方法。
其他屬性及方法介紹請參考msdn
筆者的演算法很簡單,遍歷業已定義好的關鍵字列表,用其與使用者輸入的內容進行比較,如果發現相同,則按照字元的index值計算編輯區域。
定義字型屬性
在c#中有乙個叫做font的類能夠滿足需求。
其他屬性及方法介紹請參考msdn
筆者在嘗試的過程中發現螢幕中顯示的內容會隨著使用者的輸入,出現閃爍。究其原因可能是因為windows一直在重新繪製視窗造成的,為了迴避這個問題,我們可以使用suspendlayout()和resumelayout()暫停和恢復畫面重新繪製的過程。
做完這幾步,我們的語法著色控制項也就大功告成了。下面是全部源**。在vs2008 express版本上除錯通過。
using system;using system.collections.generic;
using system.linq;
using system.text;
using system.windows.forms;
using system.text.regularexpressions;
using system.drawing;
using system.componentmodel;
namespace base
; [categoryattribute("keywords"), description("關鍵字列表")]
public ilistkeywords
set}
/// /// 關鍵字顏色(預設為藍色)
///
private color _keywordscolor = color.blue;
[categoryattribute("keywordscolor"), description("關鍵字顏色")]
public color keywordscolor
set}
// todo 數字,字串屬性
/// /// 分隔符
///
regex tokens = new regex(@"[\s\r\n\t\(\)\;]");
/// /// 接受輸入時語法著色
///
///
protected override void ontextchanged(eventargs e)
}// break;}}
// 計算輸入點的位置,如果不在末尾,則說明使用者在修改前面的內容,否則將焦點移到末尾
this.selectionstart = (inputpoint < this.text.length) ? inputpoint : this.text.length;
this.selectionlength = 0;
resumelayout();}}
}
如何做乙個專案
早上上csdn瞧瞧,發現有位同學想在暑期做個論壇,想要點建議,相信有不少已經入門想有所提高的同學都有這個想法。那麼我就在此提幾點意見,大家可以討論討論。首先選專案,我覺得這位同學拿論壇入手是比較合適的,原因有這樣幾點 1 論壇的基本業務邏輯大家都很熟悉2 量不是很大,可以在兩個月內完成基本功能的實現...
如何做乙個快樂的人
人,要做乙個明白人。所謂明白人,既能努力改變環境,更能努力改變心境。改變環境靠聰明,改變心境靠智慧型。智慧型的人能悟出人生真諦,把握生活方向,知道自己的根本追求,不會為了一點瑣事而惱。開心的前提是愛心。所謂愛心,可理解為乙個人要有愛人之善心,也可理解為人要愛自己的心。通過修身養性,純潔心靈,隨時調控...
如何做乙個有趣的人
1 不善表達是能力不行 儲備太少 不是性格內向 請不要自欺欺人咯 這句話至少對於自己完全沒毛病。2 極簡主義 衣服不要多,但要有質感。朋友不要多,但要有交情。資訊不要多,但都很重要。讀書不必多,但要有深度。東西不必多,但要用得著。3 作者對極簡主義的理解 不對這個泛泛的世界投注太多的感情 太多的時間...