Rich Contex

RichTextBox に Contex Menu を設定します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. TextBox には自動的に Contex Menu が設定されるのですが、RichTextBox には設定されないようです。
    そこで RichTextBox に Contex Menu を設定してみましょう。
    Visual Studio 2013 Preview のテストも兼ねて、自動生成のプロジェクトを使います。
    プロジェクトの作成は TextBox を貼り付ける を参照して下さい。
  2. Form1.cs をダブルクリックしてデザインを表示します。
    ツールボックスからフォーム全体に RichTextBox を貼り付けます。
  3. Form の Constructor から RichTextBox にテスト用の TEXT を設定します。
    richTextBox1 に「Line No: 0 ~ Line No: 9」の文字が格納されます。
        public Form1()
        {
            InitializeComponent();
            for(int line= 0; line<10; line++)
            {
                richTextBox1.AppendText("Line No: " + line + "\n");
            }
        }
    
  4. ツールボックスから Form に ContextMenuStrip を貼り付けます。
    Contex Menu の基本は
    ContextMenu を設定する を参照して下さい。
    ContextMenu 名は規定値で ContextMenuStrip1 になります。
    ContextMenu の各項目を設定します。
    TEXT表示 ハンドラ
    コピー(&C) Copy
    切り取り(&T) Cut
    貼り付け(&P) Paste
    元に戻す(&U) Undo
    やり直す(&R) Redo
  5. Form1.cs のデザインを表示して、richTextBox1 のプロパティから ContextMenuStrip に ContextMenuStrip1 を選択します。
    ContextMenu が正常に作成されていると ContextMenuStrip1 が選択できるようになっています。
    コンパイル&実行して、RichTextBox 上で右クリックすると ContextMenu が表示されます。

イベントハンドラ

  1. イベントハンドラをプログラムします。
    デザイン画面の ContextMenuStrip からイベントハンドラを設定して下さい。
    詳細は ContextMenu を設定する を参照して下さい。
  2. 選択文字列をクリップボードに格納する Copy() メソッドです。
            private void Copy(object sender, EventArgs e)
            {
                if (richTextBox1.SelectionLength > 0)
                {
                    richTextBox1.Copy();
                }
            }
    
  3. 選択文字列を削除する Cut() メソッドです。
    削除した文字列は、クリップボードにコピーされています。
            private void Cut(object sender, EventArgs e)
            {
                if (richTextBox1.SelectionLength > 0)
                {
                    richTextBox1.Cut();
                }
            }
    
  4. クリップボードから文字列を貼り付ける Paste() メソッドです。
            private void Paste(object sender, EventArgs e)
            {
                IDataObject data = Clipboard.GetDataObject();
                if (data != null && data.GetDataPresent(DataFormats.Text) == true)
                {
                    richTextBox1.Paste();
                }
            }
    
  5. 編集を元に戻す Undo() メソッドです。
            private void Undo(object sender, System.EventArgs e)
            {
                if (richTextBox1.CanUndo)
                {
                    richTextBox1.Undo();
                }
            }
    
  6. Undo をやり直す Redo() メソッドです。
            private void Redo(object sender, System.EventArgs e)
            {
                if (richTextBox1.CanRedo)
                {
                    richTextBox1.Redo();
                }
            }
    
  7. RichTextBox 上で右クリックして ContextMenu を実行してみて下さい。
    各メソッドでは、実行可能か否かを調べていますが、必ずしも必要ありません。
    多くの場合は、そのまま実行できるので試してみて下さい。

【NOTE】

Text Editor の作成に必要なメソッドを抜粋します。
  1. RichTextBox のメソッドです。
    メソッド 説明
    richTextBox1.Copy(); 選択文字列⇒クリップボード
    richTextBox1.Cut(); 選択文字列⇒クリップボードの後削除
    richTextBox1.Paste(); クリップボードから貼り付け
    richTextBox1.Undo(); 編集を元に戻す
    richTextBox1.Redo(); Undo をやり直す
    richTextBox1.AppendText(str); string str を追加する
    richTextBox1.Clear(); 登録 string をクリア
    int p = richTextBox1.Find("ABC", pos, -1, RichTextBoxFinds.None); "ABC" を検索して選択する
    int p = richTextBox1.Find("ABC", 0, pos, RichTextBoxFinds.Reverse); 逆方向に検索して選択する
    string str = richTextBox1.SelectedText.ToString(); 選択文字列を取得
    string str = richTextBox1.SelectedText; 選択文字列を取得
    richTextBox1.SelectedText = str; 選択文字列の置き換え(空のときは挿入)
    int pos = richTextBox1.SelectionStart; キャレット(カーソル)の位置を取得
    richTextBox1.Select(idx, 4); idx から 4 文字を選択状態に設定
    richTextBox1.SelectionLength = 0; 選択状態の解除
    richTextBox1.Select(idx, 0); キャレット(カーソル)の設定
    richTextBox1.SelectionStart = idx; キャレットの設定
    richTextBox1.TextBox1.ScrollToCaret(); キャレットの位置までスクロール
    richTextBox1.ScrollToCaret(); キャレットの位置までスクロール
    richTextBox1.SelectionColor = Color.Red; 選択文字列を Red(赤) に設定
    richTextBox1.SelectionFont = font; 選択文字列にフォントを設定
    richTextBox1.Font = font; RichTextBoxにフォントを設定
    richTextBox1.LanguageOption = RichTextBoxLanguageOptions.UIFonts; Arialフォントを使わない
    int idx = richTextBox1.GetFirstCharIndexOfCurrentLine(); 現在行の先頭 Index
    int idx = richTextBox1.GetFirstCharIndexFromLine(line); line 行の先頭 Index
    int line = richTextBox1.GetLineFromCharIndex(idx); idx が含まれる行番号
    if (richTextBox1.Modified) TEXT が更新されたか調べる
    richTextBox1.Modified = false; 更新フラグをリセット
  2. richTextBox1.Text は RichTextBox の データを格納する string 型の領域です。
    当然ながら、この領域に対して string のメソッドを使うことが出来ます。
    メソッド 説明
    richTextBox1.Text = str richTextBox1 に文字列を設定
    int idx = richTextBox1.Text.IndexOf("abc"); "abc" を検索
    int idx = richTextBox1.Text.LastIndexOf("abc"); 最後に見つかった位置
    int idx = richTextBox1.Text.IndexOf('/'); 文字 '/' を検索
    richTextBox1.Text = richTextBox1.Text.Insert(pos, "abc"); 文字列の挿入
    richTextBox1.Text = richTextBox1.Text.Replace("abc", "xyz"); 全ての文字列の置き換え
    richTextBox1.Text = richTextBox1.Text.Remove(pos, len); 文字列の削除
    string str = richTextBox1.Text.Substring(pos,len); 部分文字列(pos から len 文字長)を取得
  3. richTextBox1.Lines[n] は現在画面に表示中の string 型の配列です。
    Lines[10] は現在表示中の 10 行目の文字列です。
    1行で表示できなくなり、折り返し表示が行われると行番号がずれるので注意して下さい。
    この領域に対しても string のメソッドを使うことが出来ます。
    メソッド 説明
    int n = richTextBox1.Lines.Length; 表示されている行数
    string str = richTextBox1.Lines[n]; n 行目の string を取得
    string str = richTextBox1.Lines[3].Remove(0,2); 4行目の0番目から2文字を削除した文字列
    string str = richTextBox1.Lines[n].Substring(pos,len); 部分文字列を取得

【行の Copy, Cut, Paste の例】

  1. フォントや色が設定されている箇所に Text を挿入すると、同じフォントや色になります。
    事前に挿入箇所のフォントや色を確認しておいて下さい。
  2. 現在行(キャレットが設定されている行)を str にコピーします。
        int     idx, line;
        string  str:
    
        idx = richTextBox1.GetFirstCharIndexOfCurrentLine();    //現在行の先頭 Index
        line = richTextBox1.GetLineFromCharIndex(idx);          //idx の行番号
        str = richTextBox1.Lines[line];                         //line 行を取得
        Console.WriteLine(str);
    
  3. 現在行(キャレットが設定されている行)を "" に置き換えることにより削除します。
        int     idx, line, wk;
    
        idx = richTextBox1.GetFirstCharIndexOfCurrentLine();    //現在行の先頭 Index
        line = richTextBox1.GetLineFromCharIndex(idx);          //idx の行番号
        wk = richTextBox1.GetFirstCharIndexFromLine(line+1);    //line+1 行の先頭 Index
        richTextBox1.Select(idx, wk-idx);                       //idx~wk-idx を選択する
        richTextBox1.SelectedText = "";                         //選択範囲を "" にする
    
  4. 現在行(キャレットが設定されている行)を Remove で削除します。
        int     idx, line, wk;
    
        idx = richTextBox1.GetFirstCharIndexOfCurrentLine();    //現在行の先頭 Index
        line = richTextBox1.GetLineFromCharIndex(idx);          //idx の行番号
        wk = richTextBox1.GetFirstCharIndexFromLine(line+1);    //line+1 行の先頭 Index
        richTextBox1.Text = richTextBox1.Text.Remove(idx, wk-idx);
        richTextBox1.Select(idx, 0);            
    
  5. 現在行(キャレットが設定されている行)の直前に1行(str)を挿入ます。
        int     idx, line;
        string  str= "Insert Text\n":
    
        idx = richTextBox1.GetFirstCharIndexOfCurrentLine();    //行の先頭 Index
        richTextBox1.Text = richTextBox1.Text.Insert(idx, str);
        richTextBox1.Select(idx, 0);            
    
  6. 現在行を str にコピーしてから削除します。
        int     idx, line;
        string  str:
    
        idx = richTextBox1.GetFirstCharIndexOfCurrentLine();    //現在行の先頭 Index
        line = richTextBox1.GetLineFromCharIndex(idx);          //idx の行番号
        str = richTextBox1.Lines[line];                         //line 行を取得
        wk = richTextBox1.GetFirstCharIndexFromLine(line+1);    //line+1 行の先頭 Index
        richTextBox1.Select(idx, wk-idx);                       //idx~wk-idx を選択する
        richTextBox1.SelectedText = "";                         //選択範囲を "" にする
    

超初心者のプログラム入門(C# Frame Work)