리치 텍스트 상자에서 창을 복사, 잘라내기, 잘라내기 사용
풍부한 텍스트 상자를 가지고 있습니다.richTextBox1
)이 아래와 같이 내 프로그램에 표시됩니다.하지만 마우스 오른쪽 버튼을 클릭해도 "복사, 잘라내기, 지나가기" 창이 뜨지 않습니다.리치 텍스트 상자에 이 "복사, 잘라내기, 지나가기" 창을 활성화하는 방법을 알려주시겠습니까?저는 C#에 익숙하지 않습니다. 해결 방법을 알고 있다면 단계별로 알려주세요.
RichTextBox가 두 개 이상인 경우 다음 확장 방법을 사용할 수 있습니다.
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();
스크린샷:
이 코드를 사용해 보십시오.
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();
}
}
표준 RichTextBox에는 잘라내기, 복사 및 붙여넣기에 대한 상황에 맞는 메뉴가 없습니다.하지만, 당신은 당신만의 코드를 구현하는 데 필요한 완전한 코드를 가진 이 기사를 볼 수 있습니다!
저는 Thilina H가 제공하는 솔루션이 버그가 거의 없는 것을 제외하고는 훌륭하다고 생각합니다.
마우스 업 이벤트로 인해 두 번째 클릭 후 오른쪽 클릭이 시작됩니다.마우스 업 이벤트 대신 마우스 다운 이벤트를 사용하는 것을 추천합니다.
두 번째로 제공된 CopyAction 방법을 테스트했습니다.제 경우 CopyAction 메서드가 문자를 복사하지 않았습니다.코드를 다음과 같이 편집해야 했습니다.
Clipboard.SetText(richTextBox1.SelectedText.Replace("\n", "\r\n"));
TextBox1을 리치할 때.선택됨텍스트가 비어 있습니다. 프로그램에 예외가 표시되었습니다.저는 문제를 해결하기 위해 아래와 같은 CopyAction 메소드만 편집했습니다.
if (chatBox.SelectedText != null && chatBox.SelectedText != "") { Clipboard.SetText(richTextBox1.SelectedText.Replace("\n", "\r\n")); }
해피 코딩!
여러 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;
}
}
}
저는 틸리나 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;
}
}
누군가에게 도움이 되길 바랍니다.
@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;
}
}
}
}
언급URL : https://stackoverflow.com/questions/18966407/enable-copy-cut-past-window-in-a-rich-text-box
'programing' 카테고리의 다른 글
FileNotFound 오류를 올바르게 발생시키는 방법은 무엇입니까? (0) | 2023.05.11 |
---|---|
어떻게 하면 다른 디렉토리에서 npm을 시작할 수 있습니까? (0) | 2023.05.11 |
iOS를 사용하여 GUID/UUID를 생성하는 방법 (0) | 2023.05.11 |
NLog를 사용하여 ${basedir}는 어디에 있습니까? (0) | 2023.05.11 |
열거형에 정의된 총 항목 수 (0) | 2023.05.11 |