1. 程式人生 > >繼承RichTextBox,完成程式碼編輯器,支援語法高亮、行號顯示;

繼承RichTextBox,完成程式碼編輯器,支援語法高亮、行號顯示;

    最近做一個小工具,需要寫SQL指令碼,可textbox和richtextbox一片黑色,對於習慣了vs的環境,實在是太慘了點。

於是產生了做一個textbox的想法。

    在網上搜了一下,關於繼承richtextbox的文章比較多(文章過載的太多),基本上結論就是行號搞不定。

    網上有個ICSharpCode的程式碼,是外國人寫的,非常強,直接在control上繪製文字,不過那原始碼看起來就惱火了,基本沒註釋;看了半個晚上,沒成績,留著以後有心情了再看。

    想想我需要的功能不多,只要有高亮就行,還是就簡單的來寫吧,繼承RichTextBox;

    首先需要解決的是字型問題,我們定程式碼一般習慣使用等寬字型(我習慣使用宋體,10畫素),rt裡如果設定為宋體,在輸入文字時,會自動變成arial(不等寬),因為宋體裡不包含E文字型檔,解決這個的方法是在輸入字型時,攔截輸入的字元,即不讓rt的keypress生效。在keypress事件裡,獲取字元,給selectedtext,並設定selectionfont為宋體字型,並設定e.handle=true,表示已經處理過keypress事件,rt就不會再處理這個了。

    現在需要處理核心問題之一的高亮,將文字中的關鍵字找出來,通過設定selectionstart和selectionlength兩個屬性,選中關鍵字部分,設定selecttioncolor屬性給關鍵字上色,這樣操作的效率很低,沒辦法,API裡沒有相關的功能(或者是我沒找到)。

    如何查詢將關鍵字,我採用的是行查詢,即查詢selecttionstart處的行,此行因為新增、刪除、插入、替換,都會影響到整行是否關鍵字(或註釋);查詢的方法是將所有關鍵 放在一個集合裡(比如Dictionary,我使用了一個獨立的類),從行的開始處開始搜尋直到行結束(0x0d,0x0a);

    上述rt上色的方法效率太低,所以,在匹配關鍵時,儘量將同類字元一起找出來一次性上色;首先我將字元歸類,字母、數字、下線、雙引號、單引號、其他符號,字母、數字、下線可以作變數,是關鍵字的,必須是全字母組合,在引號內的,無論是什麼內容,都不用理會,直接理解為普通文字,其中雙引號可以包含多組單引號;是以註釋符開始的(忽略前面的空格),後面所有文字全是為註釋;

    關於tab的處理,在keydown或keypress裡攔截,同樣,使用selectedtext=new string(" "c,4),將tab替換為4個空格,不過這樣處理的話,tab就不能用來做對齊用,實際操作時,獲取本行的第一個字元的索引(linefirstchar),以當前字元索引(selectionstart)減去linefirstchar,獲取當前位置在本行的列索引,每tab位佔4空格位,算算當前位置應該使用多少個空格來達到下一個tab位;

    複製,使用rt的copy方法就行;

    剪下,使用rt的cut方法,不過完成後還得重新處理一次高亮;

    回車,添加回車符,完成後原行和新行都要處理一次高亮(如果在關鍵字中間回車,關鍵字被切斷,不處理的話還是高亮顯示);

    最麻煩的是貼上,如果是單行貼上,處理當前行就可以了;但是多行貼上的使用更為頻繁,所以,具體的操作就是將要貼上的text放在變數裡,從變數裡進行字元處理,查詢詞或字元組合,一部分一部分的插入到當前rt裡,當然是關鍵字的設定高亮,註釋的設定灰色,其他的設定黑色,不得不說,使用selectioncolor的效率,如果是幾行,忍了,100行居然的用了1.5秒,我KAO。。。

    rt還有一個selectedrtf屬性,這個屬性是直接插入帶格式的text,這樣,研究一下rtf的存貯格式吧,將需要插入的文字以rtf的格式放在變數裡,所有text處理完成之後,一次性插入rt裡,連selectioncolor這一步都省了,那速度確實爽啊。500行的文字,CTRL+V立馬就出來了。

    使用了rtf格式之後,在rt的new方法裡,先弄一段格式文字,讓rt使用此格式,比設定rt.font屬性還好,在輸入字元時就不需要頻繁的設定selectionfont屬性了。

    做到這裡我想要的最基本的功能就完成了,不過rt有個SelectionIndent屬性,這個屬性可以讓rt內的選中(或後輸入的)文字縮排(畫素單位),這不正好給我準備放一個帶子顯示行號嗎?

    宣告一個label放在rt.controls裡,在label裡繪製行號,rt的scroll事件可以告訴我,滾動條有滾動事件,這樣在label裡重新繪製就行了,提示 下,如果直接在label裡繪製,閃爍是肯定的,所以我使用了bitmap作緩衝,在bitmap裡繪製好了,再將bitmap直接繪製到label上(做遊戲的原理),具體操作就不多哆嗦了。

    使用API的GetScrollPos繪製滾動的值(畫素),以確定在什麼地方繪製行號,font.height是字元行高,不過這個行高不準確,以9pt(12pixel)為例,實際行高還要加2畫素才行。rt裡的文字也不是從y=0開始繪製的,而是從y=2開始繪製的,多實驗一下就知道是啥數值了。

    還有一個重要的,當前螢幕顯示第一行的行索引,使用Api的sendmessage handle,EM_GETFIRSTVISIBLELINE,0,0可以獲取,這個數字很重要,點選label時,可以將對應行全選,沒這個方法,是不可能完成的。

    小心:SelectionIndent這個屬性,如果你全選文字,刪除,這個屬性失敗,文字游標就到了最前面,所在要在KeyUP事件裡攔截delete和backspace,重新設定這個屬性;

以上是效果圖,已經達到我想要的功能:

1. 語法高亮。

2. 行號。

3. 回車隨上一行縮排。

4. tab對齊

5. 點選行號選擇整行

不盡人意的就是在輸入時,輸入位置行有輕微閃爍;沒辦法,RT的效率就這樣了。

相關推薦

繼承RichTextBox完成程式碼編輯支援語法顯示

    最近做一個小工具,需要寫SQL指令碼,可textbox和richtextbox一片黑色,對於習慣了vs的環境,實在是太慘了點。 於是產生了做一個textbox的想法。     在網上搜了一下,關於繼承richtextbox的文章比較多(文章過載的太多),基本上結

繼承RichTextBox完成程式碼編輯支援語法顯示(二)

    當前輸入行閃爍終於比較滿意的解決了。     以處理高亮匹配時,以前是直接在rt裡使用selectionstart、selectedtext替換原始文字;     首先將需要處理的文字處理完成,以RTF格式暫存到變數中,一次性替換到原始文字位置,效果有所好轉,但偶有

vi/vim編輯下systemverilog語法

2.在自己的主目錄下(一般是 /home/使用者名稱)新建名為 .vim 的隱藏資料夾,在 .vim 資料夾內新建兩個資料夾,分別是 ftdetect 和 syntax。操作如下: cd ~ mkdir .vim/ftdetec mkdir .vim/syntax

vue學習:編輯Atom配置語法

用Atom開啟一個vue專案,並不支援vue語法,所有的標籤都是灰的。 開啟File->Settings->Install,搜尋vue會出來一堆外掛,安裝language-vue-com

程式設計師最愛用的8個程式碼編輯你用哪款?

這些年來,編寫程式碼本身已經成為一種藝術。現在,有大量的程式語言可供開發者選擇使用,從組合語言到 Ruby 和 Python。儘管對於給定的專案有許多程式語言可供選擇,但有一件事是亙古不變的,每個開發者都需要一個程式碼編輯器來寫程式碼。 一個好的程式碼編輯器不僅僅是一個簡單的文字編輯工具

你可能沒用過的10款優秀程式碼編輯最喜歡哪個?

  作為程式開發人員,我們生活的大部分時間都坐在電腦前,而在電腦中我們使用最多的軟體就是程式碼編輯器。所以說,程式碼編輯器好不好用將直接影響開發人員的效率,優秀的程式碼編輯器能夠讓我們的工作事半功倍。在這篇文章中,介紹了10款功能特別的程式碼編輯器,你最喜歡哪個? 您可能感興趣的相關文章 Apta

Emacs最強編輯沒有之一

  小編知道,此標題一出,肯定會遭受廣大群眾“詬病”,說不好還會被其他編輯器的粉絲暗地裡“幹掉”。 比如,Vim,Sublime,Nano編輯器的粉絲可能就會來“踢館”,VS或Eclipse的粉絲也興許會“群起而攻”,但是小編只是表達一下自己的感受,為了效果也

vi像文字一樣使用 vim顯示語法自動縮排的設定

#vi修改使其像文字一樣使用 修改/etc/vim/vimrc.tiny裡的內容 將set compatible改成 set nocompatible 同時增加一行 set backspace=2 在/etc/vim/

在gvim編輯中設定永久顯示

一、找到安裝目錄,並找到_vimrc檔案。 二、編輯_vimrc:   加入以下內容:      set nu!      colorscheme desert       syntax

vivado設定自定義編輯與notepad++設定方法

vivado2015.03下tools->option->general->text editor -> 選擇custom editor, 右邊的 ... 瀏覽按鈕,如下圖

VSCode實現C++程式碼提示語法編譯和除錯

眾所周知,目前Microsoft Visual Studio 系列還不能遷移到Linux系統,MacOS只能湊和著用用,而且Visual Studio 2017的安裝包的體積增長到了27GB以上,安裝空間需求70GB以上的空間,一個小巧靈活的VS Code對於C

EditPlus遠端編輯語法編譯執行原始碼設定

  最近寫程式碼的過程中,除了寫Java時用的Eclipse、在Linux下編輯的Vi之外,有時也會用EditPlus開啟一些檔案,如配置檔案、日誌檔案、指令碼等。個人覺得EditPlus在很多場景下比較好用,也很輕量,其中有一些有用的功能簡單總結了一下。 1.遠端編輯 通過Sftp編輯遠端檔案,除了用S

notepad-ken不用按esc但實現了常用程式碼編輯功能的VIM

Centos、Redhat、Fedora安裝: yum install ctags cscope wget unzip vim -y && wget https://github.com/langsim/notepad-ken/archive/maste

手機上的pycharm編輯只要你有一部手機就能寫程式碼!分享給你

今天介紹一款手機上的pycharm編輯器:Pydroid 3. 手機上的pycharm編輯器,只要你有一部手機就能寫程式碼!分享給你 手機上的pycharm編輯器,只要你有一部手機就能寫程式碼!分享給你 在網上搜得到這軟體,可以下載來體驗,網上都是英文版本的,如果需要漢化版的

手機上的pycharm編輯高階版含程式碼預測及分析

昨天介紹了一款可以在手機上無限制使用liunx系統的軟體:Termux,原文:備用:手機上一樣無限制使用Python和Linux,開發沒有邊界!,今天介紹一款手機上的pycharm編輯器:Pydroid 3. 在網上搜得到這軟體,可以下載來體驗,網上都是英文版本的,如果需要漢

CodeMirror 5.42.2 釋出多功能線上程式碼編輯

   CodeMirror 5.42.2 釋出了,CodeMirror 是一款允許在瀏覽器中的多功能文字編輯器,專用於編輯程式碼,並附帶超過 100 種語言模式和各種外掛,可實現高階的程式碼編輯功能,包括程式碼高亮顯示,功能擴充套件以及多個主題樣式。 該版本更新如下: Bug

WIN10的ctrl+space與idea等程式碼編輯衝突最終解決辦法本人使用的是搜狗輸入法

翻牆找到的解決半天,注意看紅色部分就OK,主要從登錄檔下手。不懂得自己百度翻譯就行。 Go to Start > Type in regedit and start it Navigate to HKEY_CURRENT_USER/Control Panel/In

linux 日歷計算器nano編輯開關機重啟

boot sys 後臺 linux 簡單 修改 支持 鍵盤 計算 1.查看文件下面所有的隱藏目錄:ls -al 2.顯示具體的年月日:date +%y/%m/%d  或date +%Y/%m/%d 3.顯示這個月的日歷: cal    顯示某年日歷: cal 2017

laravel項目3myPersimmon學習(使用了什麽插件視圖編輯migrateseeder)1urlencodesha1_file

tex seed for _id signed 插件 section index void p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p

ueditor 編輯自定義圖片上傳

action () scree val ech idt tof height 使用 <div> <h1>完整demo</h1> <form method="post" name="form">