C#:RichTextBoxでソースコードを高速でハイライトする方法
C#でプログラミング用のエディタを作ろうと思っているのですが、もっともハードルが高いのがキーワードなどのハイライト処理です。
タイプしながら色変換しなきゃいけないので速度が重要になってきます。
RichTextBoxの標準プロパティ/メソッドを駆使すると速度に問題があるので、Rtfフォーマットをいじることで速度問題を解決しました。
ソースコードは最後に載せていますが、その前にいくつか書いておきます。
[ad#top-1]
苦労した点
キーワードのハイライトはそれほど苦労しませんでしたが、文字リテラルとコメント文はかなり苦労しており、何度も作り直しています。
特に苦労した点を下記しておきます。
正規表現を使ってサクッと作りたかったんですが、結局ループと条件分岐を駆使せざるを得ませんでした。速度が心配でしたがとりあえず大丈夫そうです。
すべての言語に対応していません…
コメントが//または/* */の言語のみ対応です。Pythonの#やVBの’には対応していません。ということでまだ未完成の状態です。
いつかは全対応させたいのですが、少し先になりそう…。
あと、文字リテラルは””のみで、Pythonの複数行カバーする”””~”””もみ対応です。こちらは難易度高そう。素直にSpyder使おう!
ハイライトの色など固定です
文字色は固定です。色を変える場合はソースを変える必要あります。フォントもMS ゴシック固定です。フォントサイズも12pt固定。
変更する場合はソースコード内のfs値を変える必要あります。
以下はheaderメソッドを抜粋したものですが、ここを編集することで変更できます。
private static string header(){ string header=""; header += "{\\rtf1\\ansi\\ansicpg932\\deff0\\deflang1033\\deflangfe1041{\\fonttbl{\\f0\\fnil"; header += "\\fcharset128 \\'82\\'6c\\'82\\'72 \\'83\\'53\\'83\\'56\\'83\\'62\\'83\\'4e;}}"; //MS ゴシック header += "{\\colortbl ;\\red255\\green0\\blue0;"; //cf1:keyword Red header += "\\red255\\green255\\blue255;"; //cf2:背景 White header += "\\red0\\green0\\blue0;"; //cf3:通常文 Black header += "\\red255\\green0\\blue255;"; //cf4: リテラル Pink header += "\\red0\\green128\\blue0;}"; //cf5: コメント Green header += "\\viewkind4\\uc1\\pard\\li75\\tx345\\tx690\\tx1020\\tx1365\\tx1710\\tx2055\\tx2385\\tx2730\\tx3075\\tx3420\\tx3750\\tx4095"; header += "\\tx4440\\tx4785\\tx5115\\tx5460\\tx5805\\tx6150\\tx6480\\tx6825\\tx7170\\tx7515\\tx7845\\tx8190\\tx8535\\tx8880\\tx9210"; header += "\\tx9555\\tx9900\\tx10245\\tx10575\\tx10920\\cf1\\highlight2\\lang1041\\f0\\fs24 "; //フォントサイズ: fs24=12pt return header; }
使い方
キーワードをList<string> keyword
に仕込みます。
RichTextBox textBox
内のテキストを以下の通りにすればハイライトできます。
textBox.Rtf = TextColorSet.keyword(textBox.Text, keyword);
プレーンテキストを投げると、Rtfフォーマットが返ってくるので、それをRtfプロパティで受け取れば良いわけです。
ソースコード全文
ソースコードはこちらです。
[ad#ad-1]
スポンサーリンク