web-dev-qa-db-ja.com

リッチテキストボックスでコピー、切り取り、過去のウィンドウを有効にする

リッチテキストボックスがあります(richTextBox1)以下のように私のプログラムで。しかし、それを右クリックしても、「コピー、カット、過去」ウィンドウはポップアップしません。この「コピー、切り取り、過去」ウィンドウをリッチテキストボックスで有効にする方法を教えてください。私はC#を初めて使用します。これを解決する方法を知っている場合は、ステップバイステップで教えてください

enter image description here

27
D P.

このコードで試してください

UPDATED CODE:

        private void richTextBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Right)
            {   //click event
                //MessageBox.Show("you got it!");
                ContextMenu contextMenu = new System.Windows.Forms.ContextMenu();
                MenuItem menuItem = new MenuItem("Cut");
                menuItem.Click += new EventHandler(CutAction);
                contextMenu.MenuItems.Add(menuItem);
                menuItem = new MenuItem("Copy");
                menuItem.Click += new EventHandler(CopyAction);
                contextMenu.MenuItems.Add(menuItem);
                menuItem = new MenuItem("Paste");
                menuItem.Click += new EventHandler(PasteAction);
                contextMenu.MenuItems.Add(menuItem);

                richTextBox1.ContextMenu = contextMenu;
            }
        }
        void CutAction(object sender, EventArgs e)
        {
            richTextBox1.Cut();
        }

        void CopyAction(object sender, EventArgs e)
        {
            Graphics objGraphics;
            Clipboard.SetData(DataFormats.Rtf, richTextBox1.SelectedRtf);
            Clipboard.Clear();
        }

        void PasteAction(object sender, EventArgs e)
        {
            if (Clipboard.ContainsText(TextDataFormat.Rtf))
            {
                richTextBox1.SelectedRtf
                    = Clipboard.GetData(DataFormats.Rtf).ToString();
            }
        } 

メモ帳などの別のアプリケーションで貼り付けをコピーする場合は(without styles )以下のメソッドを置き換えてください

       void CopyAction(object sender, EventArgs e)
        {
            Clipboard.SetText(richTextBox1.SelectedText);
        }

        void PasteAction(object sender, EventArgs e)
        {
            if (Clipboard.ContainsText())
            {
                richTextBox1.Text
                    += Clipboard.GetText(TextDataFormat.Text).ToString();
            }
        }  
29
Thilina H

複数の RichTextBox がある場合、この extension メソッドを使用できます。

_public static void AddContextMenu(this RichTextBox rtb)
{
    if (rtb.ContextMenuStrip == null)
    {
        ContextMenuStrip cms = new ContextMenuStrip()
        {
            ShowImageMargin = false
        };

        ToolStripMenuItem tsmiUndo = new ToolStripMenuItem("Undo");
        tsmiUndo.Click += (sender, e) => rtb.Undo();
        cms.Items.Add(tsmiUndo);

        ToolStripMenuItem tsmiRedo = new ToolStripMenuItem("Redo");
        tsmiRedo.Click += (sender, e) => rtb.Redo();
        cms.Items.Add(tsmiRedo);

        cms.Items.Add(new ToolStripSeparator());

        ToolStripMenuItem tsmiCut = new ToolStripMenuItem("Cut");
        tsmiCut.Click += (sender, e) => rtb.Cut();
        cms.Items.Add(tsmiCut);

        ToolStripMenuItem tsmiCopy = new ToolStripMenuItem("Copy");
        tsmiCopy.Click += (sender, e) => rtb.Copy();
        cms.Items.Add(tsmiCopy);

        ToolStripMenuItem tsmiPaste = new ToolStripMenuItem("Paste");
        tsmiPaste.Click += (sender, e) => rtb.Paste();
        cms.Items.Add(tsmiPaste);

        ToolStripMenuItem tsmiDelete = new ToolStripMenuItem("Delete");
        tsmiDelete.Click += (sender, e) => rtb.SelectedText = "";
        cms.Items.Add(tsmiDelete);

        cms.Items.Add(new ToolStripSeparator());

        ToolStripMenuItem tsmiSelectAll = new ToolStripMenuItem("Select All");
        tsmiSelectAll.Click += (sender, e) => rtb.SelectAll();
        cms.Items.Add(tsmiSelectAll);

        cms.Opening += (sender, e) =>
        {
            tsmiUndo.Enabled = !rtb.ReadOnly && rtb.CanUndo;
            tsmiRedo.Enabled = !rtb.ReadOnly && rtb.CanRedo;
            tsmiCut.Enabled = !rtb.ReadOnly && rtb.SelectionLength > 0;
            tsmiCopy.Enabled = rtb.SelectionLength > 0;
            tsmiPaste.Enabled = !rtb.ReadOnly && Clipboard.ContainsText();
            tsmiDelete.Enabled = !rtb.ReadOnly && rtb.SelectionLength > 0;
            tsmiSelectAll.Enabled = rtb.TextLength > 0 && rtb.SelectionLength < rtb.TextLength;
        };

        rtb.ContextMenuStrip = cms;
    }
}
_

そして、次のように使用します:richTextBox1.AddContextMenu();

スクリーンショット: screenshot

23
Jaex

標準のRichTextBoxには、切り取り、コピー、貼り付けのためのコンテキストメニューが含まれていません。ただし、 この記事 を見ることができます。これには、独自の実装に必要な完全なコードが含まれています!

3
Icemanind

Thilina Hによって提供されるソリューションは、いくつかのバグを除いて優れていると思います。

  1. MouseUpイベントは、2回目のクリック後に右クリックを開始します。 MouseUpイベントの代わりにMouseDownイベントを使用することをお勧めします。

  2. 2番目に提供されたCopyActionメソッドをテストしました。私の場合、CopyActionメソッドは入力文字をコピーしませんでした。次のようにコードを編集する必要がありました。

    Clipboard.SetText(richTextBox1.SelectedText.Replace("\n", "\r\n"));
    
  3. richTextBox1.SelectedTextが空の場合、プログラムは例外を示しました。以下に示すCopyActionメソッドを編集して、問題を修正しました。

        if (chatBox.SelectedText != null && chatBox.SelectedText != "")
        {
            Clipboard.SetText(richTextBox1.SelectedText.Replace("\n", "\r\n"));
        }
    

ハッピーコーディング!

3
Barry Guvenkaya

Thilina Hの回答(ポスターによって正しい回答としてマークされたもの)に追加したいだけです。コピーと貼り付けの機能は次のとおりです。メモ帳のようなものです。

void CopyAction(object sender, EventArgs e)
{
    if (richTextBox1.SelectedText != null && richTextBox1.SelectedText != "")
    {
        Clipboard.SetText(richTextBox1.SelectedText);
    }
}

void PasteAction(object sender, EventArgs e)
{
    if (Clipboard.ContainsText())
    {
        int selstart = richTextBox1.SelectionStart;
        if (richTextBox1.SelectedText != null && richTextBox1.SelectedText != "")
        {
            richTextBox1.Text = richTextBox1.Text.Remove(selstart, richTextBox1.SelectionLength);
        }

        string clip = Clipboard.GetText(TextDataFormat.Text).ToString();
        richTextBox1.Text = richTextBox1.Text.Insert(selstart, clip);
        richTextBox1.SelectionStart = selstart + clip.Length;
    }
}

私はそれが誰かを助けることを願っています。

1
DarkPh03n1X

複数のRichTextBoxインスタンスに標準のコンテキストメニューを追加する必要がある場合は、RichTextBoxから継承したカスタム拡張コンポーネントを作成することをお勧めします。ソリューションエクスプローラーのプロジェクトコンテキストメニューの[追加]-> [新しいアイテム...]-> [カスタムコントロール]から新しいコンポーネントを追加できます。

コンテキストメニューを開くハンドラを定義して、テキストが選択されているか、クリップボードが空ではないか、コントロールが読み取り専用に設定されていないかを確認することもできます。

[元に戻す]、[やり直し]、[削除]、[すべて選択]などの他の便利な標準アクションをサポートすることも有効です。

namespace Common
{
    public partial class RichTextBoxEx : RichTextBox
    {
        public RichTextBoxEx()
        {
            AddContextMenu();
        }

        public void AddContextMenu()
        {
            ContextMenuStrip cms = new ContextMenuStrip { ShowImageMargin = false };

            ToolStripMenuItem tsmiUndo = new ToolStripMenuItem("Undo");
            tsmiUndo.Click += (sender, e) => { if (CanUndo) Undo(); };
            tsmiUndo.ShortcutKeys = Keys.Z | Keys.Control;
            cms.Items.Add(tsmiUndo);

            ToolStripMenuItem tsmiRedo = new ToolStripMenuItem("Redo");
            tsmiRedo.Click += (sender, e) => { if (CanRedo) Redo(); };
            tsmiRedo.ShortcutKeys = Keys.Y | Keys.Control;
            cms.Items.Add(tsmiRedo);

            cms.Items.Add(new ToolStripSeparator());

            ToolStripMenuItem tsmiCut = new ToolStripMenuItem("Cut");
            tsmiCut.Click += (sender, e) => Cut();
            tsmiCut.ShortcutKeys = Keys.X | Keys.Control;
            cms.Items.Add(tsmiCut);

            ToolStripMenuItem tsmiCopy = new ToolStripMenuItem("Copy");
            tsmiCopy.Click += (sender, e) => Copy();
            tsmiCopy.ShortcutKeys = Keys.C | Keys.Control;
            cms.Items.Add(tsmiCopy);

            ToolStripMenuItem tsmiPaste = new ToolStripMenuItem("Paste");
            tsmiPaste.Click += (sender, e) => Paste();
            tsmiPaste.ShortcutKeys = Keys.V | Keys.Control;                
            cms.Items.Add(tsmiPaste);

            ToolStripMenuItem tsmiDelete = new ToolStripMenuItem("Delete");
            tsmiDelete.Click += (sender, e) => { SelectedText = ""; };                                
            cms.Items.Add(tsmiDelete);

            cms.Items.Add(new ToolStripSeparator());

            ToolStripMenuItem tsmiSelectAll = new ToolStripMenuItem("Select All");
            tsmiSelectAll.Click += (sender, e) => { SelectionStart = 0; SelectionLength = Text.Length; };
            tsmiSelectAll.ShortcutKeys = Keys.A | Keys.Control;
            cms.Items.Add(tsmiSelectAll);

            cms.Opening += delegate (object sender, CancelEventArgs e) 
            {
                tsmiUndo.Enabled = CanUndo && !this.ReadOnly;
                tsmiRedo.Enabled = CanRedo && !this.ReadOnly;
                tsmiCut.Enabled = (SelectionLength != 0) && !this.ReadOnly;
                tsmiCopy.Enabled = SelectionLength != 0;
                tsmiPaste.Enabled = Clipboard.ContainsText() && !this.ReadOnly;
                tsmiDelete.Enabled = (SelectionLength != 0) && !this.ReadOnly;
                tsmiSelectAll.Enabled = (TextLength > 0) && (SelectionLength < TextLength);
            };

            ContextMenuStrip = cms;
        }
    }
}
1
Chronos

@ Jaex に感謝

https://stackoverflow.com/a/36624233/5132252

https://stackoverflow.com/a/435510/5132252

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
    internal static extern IntPtr GetFocus();

    private Control GetFocusedControl()
    {
        Control focusedControl = null;
        // To get hold of the focused control:
        IntPtr focusedHandle = GetFocus();
        if (focusedHandle != IntPtr.Zero)
            // Note that if the focused Control is not a .Net control, then this will return null.
            focusedControl = Control.FromHandle(focusedHandle);
        return focusedControl;
    }

    private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
    {

        if (Clipboard.ContainsText())
        {
            var FocusedControl = GetFocusedControl();

            if (FocusedControl != null)
                switch (FocusedControl.GetType().Name)
                {
                    case "RichTextBox":
                        {
                            var RichTextBox = FocusedControl as RichTextBox;
                            RichTextBox.Paste();
                            break;
                        }
                    case "TextBox":
                        {
                            var TextBox = FocusedControl as TextBox;
                            TextBox.Paste();
                            break;
                        }

                }
        }
    }
0
Kia.g