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 を設定します。
        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 行目の文字列ですが、ウインドウの幅が変わり改行位置が変更されると行番号がずれるので注意して下さい。
    この領域に対しても 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); 部分文字列を取得

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