「構文の色指定」では、C1TextRange オブジェクトを使用し、選択範囲を移動することなくドキュメントの一部分のスタイルを変更する方法について説明しました。ただし、ドキュメント自体ではなく、ビューのみを変更する必要がある場合もあります。
たとえば、現在の選択範囲は、異なる前景色と背景色で強調表示されます。これは、ドキュメント自体ではなくビューに属するスタイルの変更です。他の例としては、構文の色指定や入力中のスペルチェックがあります。
C1RichTextBox コントロールは、StyleOverrides プロパティを使用してこのようなシナリオをサポートします。このプロパティには、ビューにのみ適用される範囲とスタイルの変更を指定するためのオブジェクトのコレクションが含まれます。この方法には、前のセクションで行った C1TextRange オブジェクトにスタイルの変更を適用する方法に比べて、次の2つのメリットがあります。
スタイルのオーバーライドはドキュメントに適用されず、ドキュメントを HTML として保存する際も適用されません(通常、現在の選択範囲やスペルミスのインジケータをファイルに保存する必要はありません)。
この方法は、ドキュメントに変更を加えず、また現在可視の部分にのみ影響するので、C1TextRange オブジェクトを直接変更する方法よりはるかに効率的です。
この方法には、ドキュメントフローに影響するスタイル要素をスタイルの変更に入れることができないという制限があります。スタイルのオーバーライドを使用して、背景や前景を変更したり、ドキュメントの一部に下線を引くことができます。ただし、フォントのサイズやスタイルの変更は、ドキュメントフローに影響する可能性があるので実行できません。
ここでは、前の構文の色指定の例をスタイルのオーバーライドの使用例に変えて示します。
まず、C1RangeStyleCollection オブジェクトを宣言し、これをコントロールの StyleOverrides コレクションに追加する必要があります。これで、コレクションに追加されたすべてのオーバーライドがコントロールに適用されるようになります。後で、ドキュメントの構文の色指定部分をコレクションに挿入します。
ここで必要なことは、以前に示した UpdateSyntaxColoring メソッドを変更して、(以前のようにドキュメントに色指定を適用する代わりに)そこでコレクションに範囲スタイルを挿入します。
変更されたコードは、元のコードとほとんど同じです。ドキュメントの色指定のためのブラシを作成する代わりに、前景のプロパティをオーバーライドした C1TextElementStyle オブジェクトを作成します。このコードは、最初にオーバーライドコレクションをクリアし、次に正規表現を使用してドキュメント内の各 HTML タグの場所を特定し、最後に範囲を C1TextElementStyle オブジェクトに関連付ける C1RangeStyle オブジェクトをオーバーライドコレクションに挿入します。
この新しいコードを実行すると、パフォーマンスが格段に向上していることがわかります。新しいコードは、元のコードより数千倍高速です。