2013-01-14 3 views
5

可能性の重複:
How to prevent richTextBox to paste images within it?リッチテキストボックステキストのみを作成するには?

あなたがRichtextboxを使用している場合は、いくつかの利点は、例えばRichtextboxにあります

我々はそれに色のフォントを使用することができます

カスタムフォントの設定ここで enter image description here

は私の問題です:

は、私はちょうどそれがテキストのみにすることができます地域

に絵を見てみるなど。それに

をファイルを添付?

私のプロジェクトでは、添付ファイルなどはまったく必要ありません。私はそれに画像を貼り付けたり貼り付けたりしたくないと思っていました。「テキストのみ」Richtextbox

どうすればいいですか?

+0

がTextAreaのようなものではないのですか? –

+0

@EuclidesMulémbwè - 彼は太字、イタリックのようなすべての機能を必要とするかもしれませんが、画像はありません –

+0

@DJKRAZEもし彼が読み取り専用を使用していれば、キーボードでテキストを追加することもできません。 –

答えて

6

RichTextBoxにはImagesまたはObjectsコレクションがないので、RTFフォーマットコードのために移動する必要があります。 RichTextBoxのすべてのデータは、特別な書式設定コードを含むプレーンテキストとして保存されます。これは、RTFプロパティを使用してコントロールによって公開されます。このコード言語を読んだり変更したりするには、このコード言語を学ぶことが不可欠です。学習リソースはウェブ全体で簡単に利用できます。たとえば、この概要を参照してください。 RichTextBoxは、MS Wordなどのいくつかのフル機能エディタよりも単純化されたRTFコードを使用しているため、データを操作する前にRTBにデータをロードするのが通常有益です。

短い話をすると、「pict」コマンドまたは「object」コマンドで始まるrtfグループを検索する必要があることがわかりました。グループがネストされていることが分かっているので、そこから最初の終了グループのcharを見つけることはできません。charの文字列を解析し、グループの終了を見つけるためにグループ化のカウントを維持する必要があります。これで文字列のその部分を削除するのに十分な情報が得られました。 Rtfには複数の画像/オブジェクトグループが含まれているので、すべてを削除するまでこれを行う必要があります。これらのグループを削除した後にrtf stringを返すサンプル関数を次に示します:

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; 
} 

これはいつ行う必要がありますか?あなたはすでにペーストに言及しています。また、Insertもあります。これらは、クリップボード情報を取得し、それに応じて処理する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; 
     } 
    } 
} 
+0

うわー、これは非常に正確な答えです。あなたの答えをありがとう。 – Ricks

+0

あなたは 'if(rtf(i)== '{')'あなたがあなたの答えを少し編集したときに ''(rtf [i] == '{') ' – botenvouwer

+1

あなたのコード例をもう少しコピー貼り付けるようにしてください。 – botenvouwer

2

はい、可能です。

RichTextBox1_KeyDownでCtrl + Vを処理し、次にクリップボードのデータ形式をチェックします。データがプレーンテキストの場合は貼り付けます。データがRTFの場合は、クリップボードの内容を変更せずにプレーンテキストに変換して(バッファに)貼り付けます。他のタイプのデータは貼り付けないでください。

これは単なる続行する方法をお見せする部分の例である:

private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.V) 
    { 
      // suspend layout to avoid blinking 
      richTextBox2.SuspendLayout(); 

      // get insertion point 
      int insPt = richTextBox2.SelectionStart; 

      // preserve text from after insertion pont to end of RTF content 
      string postRTFContent = richTextBox2.Text.Substring(insPt); 

      // remove the content after the insertion point 
      richTextBox2.Text = richTextBox2.Text.Substring(0, insPt); 

      // add the clipboard content and then the preserved postRTF content 
      richTextBox2.Text += (string)Clipboard.GetData("Text") + postRTFContent; 

      // adjust the insertion point to just after the inserted text 
      richTextBox2.SelectionStart = richTextBox2.TextLength - postRTFContent.Length; 

      // restore layout 
      richTextBox2.ResumeLayout(); 

      // cancel the paste 
      e.Handled = true; 
    } 
} 
関連する問題