DOSEIの日記

技術メモ+日常ログ

RichTextBoxクラスのプロテクト機能の問題点

RTFでは、文字列にプロテクト属性がつけられる。そしてプロテクト属性が付いた文字列を編集しようとすると、イベントが発生する。

たとえば、次の文字列でABCにプロテクトがかかってるとする。

slimeABCpanda

ここで、ABCを消そうとしたり、上書きしようとしたり、AとBの間、BとCの間で文字を挿入しようとすると、Beepがなりイベントが発生する。
ここで問題なのは、プロテクトが一番最初だった場合である。(|)がカーソル位置とすると、

ABCpanda
ここで文字を挿入しようとするとプロテクトイベントが発生する。(APIレベルならEN_PROTECTED通知メッセージ)途中のプロテクト文字列の直前なら文字が挿入できるのに! このメッセージをハンドルできる場合は、このイベントを無効にできるのだが、.NET Frameworkカプセル化されたRichTextBoxのProtectedイベントでは無効にできない。プロテクト機能を有効に活用したい場合、これがネックになってしまう。普通の場面では文頭には挿入可能であるほうがうれしい。それから、プロテクトされてても特定の位置にだけ挿入できたりするとうれしい。だから、プロテクトをキャンセルにしたいわけだ。 というわけで、だれか解決策を教えてはてなダイアリーあとついでに、KeyDownイベントを作ると、IME入力が中途半端に崩壊するのは仕様でしょうか。KeyDownイベントのせいではなくて、.Textプロパティを読むとだめらしい。読んだだけなのにぃ