RichTextBoxにはImagesまたはObjectsコレクションがないため、RTFフォーマットコードを使用する必要があります。RichTextBoxのすべてのデータは、特別なフォーマットコードを含むプレーンテキストとして保存されます。これは、RTFプロパティを介してコントロールによって公開されます。このコード言語を読んだり変更したりする場合は、このコード言語を学ぶことが不可欠です。学習リソースはWeb全体で簡単に利用できます。たとえば、この概要を参照してください。RichTextBoxは、MS Wordなどのいくつかのフル機能エディターよりも単純化されたrtfコードを使用するため、通常、操作する前にデータをRTBにロードすると、多くの冗長データが削除されます。
簡単に言うと、「pict」または「object」コマンドで始まるrtfグループを検索する必要があることがわかりました。グループがネストされている可能性があることを知っていると、そこから最初のend-group charを見つけることはできません。グループ化のカウントを維持しながら、文字列charをcharごとに解析して、それらのグループの終わりを見つける必要があります。これで、文字列のその部分を削除するのに十分な情報が得られました。Rtfには複数の画像/オブジェクトグループが含まれている可能性があるため、すべてが削除されるまでこれを行う必要があります。これらのグループを削除した後にrtf文字列を返すサンプル関数を次に示します。
private string removeRtfObjects(string rtf)
{
//removing {\pict or {\object groups
string pattern = "\\{\\\\pict|\\{\\\\object";
Match m = Regex.Match(rtf, pattern);
while (m.Success) {
int count = 1;
for (int i = m.Index + 2; i <= rtf.Length; i++) {
//start group
if (rtf(i) == '{') {
count += 1;
//end group
} else if (rtf(i) == '}') {
count -= 1;
}
//found end of pict/object group
if (count == 0) {
rtf = rtf.Remove(m.Index, i - m.Index + 1);
break; // TODO: might not be correct. Was : Exit For
}
}
m = Regex.Match(rtf, pattern);
//go again
}
return rtf;
}
これはいつ行う必要がありますか?貼り付けについてはすでに説明しましたが、挿入もあります。これらは、クリップボード情報を取得してそれに応じて処理するKeyDownイベントでトラップできます。自分で操作を処理したときにe.Handled=Trueを設定すると、コントロールがこのキーの組み合わせに対してデフォルトの処理を実行してはならないことを通知します。これは、ユーザーのクリップボードを破壊せずに画像の貼り付けをブロックする方法でもあります。例:
private void RichTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
//aware of Paste or Insert
if (e.Control && e.KeyCode == Keys.V || e.Shift && e.KeyCode == Keys.I) {
if (Clipboard.ContainsImage || Clipboard.ContainsFileDropList) {
//some images are transferred as filedrops
e.Handled = true;
//stops here
} else if (Clipboard.ContainsData(DataFormats.Rtf)) {
RichTextBox rtbox = new RichTextBox();
//use a temp box to validate/simplify
rtbox.Rtf = Clipboard.GetData(DataFormats.Rtf);
this.RichTextBox1.SelectedRtf = this.removeRtfObjects(rtbox.Rtf);
rtbox.Dispose();
e.Handled = true;
}
}
}