使用鼠标单击将 RichTextBox 的选定文本复制到剪贴板
Copy selected text of a RichTextBox to the Clipboard with a Mouse Click
我有一个 RichTextBox(RTB),它从两个来源获取文本,一个是 txt 文件,另一个是来自 SQLite 数据库的数据。
RTB 已将 ReadOnly
属性 设置为 False
。
我试图不使用 ContextMenuStrip。这可能是不可能的?
这是从数据库中获取数据并填充 RTB
的过程
突出显示我要复制的文本并在 RTB RESULT NO Copy
中单击
这次我单击我的代码运行的表单,但第二个进程尝试从数据库中获取相同的数据,但没有复制任何文本。
这是代码不整洁,但我正在测试。
Public Class frmViewCode
Dim gvW As String
Public Sub rtbViewCode_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown
If e.Button = System.Windows.Forms.MouseButtons.Left Then
BigCopy()
MsgBox("It Worked")
End If
End Sub
好的,我更改了 BigCopy,现在所选代码已添加到剪贴板
但是我还是需要点击Form来执行代码
仍然想点击 RTB 以触发 BigCopy 代码?
Public Sub BigCopy()
Dim start = rtbViewCode.SelectionStart
Dim substring = rtbViewCode.Text.Substring(0, start)
Dim words = substring.Split(New String() {" ", vbCrLf}, StringSplitOptions.None)
Dim count = words.Length
gvW = rtbViewCode.SelectedText
Clipboard.SetText(gvW)
End Sub
我很好奇如何更改 System.Windows.Forms 以便我可以点击 RTB。
问题如何 select RTB 中的文本并使用鼠标将该文本复制到剪贴板?
我也试过这个代码:
Public Sub RightMouse_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim start = rtbViewCode.SelectionStart
Dim substring = rtbViewCode.Text.Substring(0, start)
Dim words = substring.Split(New String() {" ", vbCrLf}, StringSplitOptions.None)
Dim count = words.Length
MsgBox("Len " & count)
lblMsg.Text = count.ToString()
'gvW = words.ToString
'gvW = rtbViewCode.SelectedText
'Clipboard.SetText(gvW)
Clipboard.SetText(rtbViewCode.SelectedRtf, TextDataFormat.Rtf)
MsgBox("here " & gvW)
End Sub
我认为您最好使用 ContextMenuStrip。无论如何,您可以使用自定义控件捕获 WM_LBUTTONDOWN
并在按下鼠标左键时执行复制,有一个活动选择并且鼠标指针位于选择内。
在这种情况下,您抑制 消息,因此不会删除选择。
如果要在将焦点移动到其他控件时保持选择可见,请设置 HideSelection = False
。
如果这不是预期的行为,请更改 IsMouseDownInsideSelection()
方法或 WM_LBUTTONDOWN
中的 逻辑 。
Public Class RichTextBoxEx
Inherits RichTextBox
Private Const WM_LBUTTONDOWN As Integer = &H201
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = WM_LBUTTONDOWN Then
If SelectionLength > 0 AndAlso IsMouseDownInsideSelection() Then
Copy()
Return
End If
End If
MyBase.WndProc(m)
End Sub
Private Function IsMouseDownInsideSelection() As Boolean
Dim charIdx = GetCharIndexFromPosition(PointToClient(MousePosition))
If charIdx >= SelectionStart AndAlso charIdx <= (SelectionStart + SelectionLength) Then Return True
Return False
End Function
End Class
您可以使用 Clipboard.SetText(RichTextBox1.Text)
功能将所有文本复制到剪贴板
我有一个 RichTextBox(RTB),它从两个来源获取文本,一个是 txt 文件,另一个是来自 SQLite 数据库的数据。
RTB 已将 ReadOnly
属性 设置为 False
。
我试图不使用 ContextMenuStrip。这可能是不可能的?
这是从数据库中获取数据并填充 RTB
的过程
突出显示我要复制的文本并在 RTB RESULT NO Copy
这次我单击我的代码运行的表单,但第二个进程尝试从数据库中获取相同的数据,但没有复制任何文本。
这是代码不整洁,但我正在测试。
Public Class frmViewCode
Dim gvW As String
Public Sub rtbViewCode_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown
If e.Button = System.Windows.Forms.MouseButtons.Left Then
BigCopy()
MsgBox("It Worked")
End If
End Sub
好的,我更改了 BigCopy,现在所选代码已添加到剪贴板
但是我还是需要点击Form来执行代码
仍然想点击 RTB 以触发 BigCopy 代码?
Public Sub BigCopy()
Dim start = rtbViewCode.SelectionStart
Dim substring = rtbViewCode.Text.Substring(0, start)
Dim words = substring.Split(New String() {" ", vbCrLf}, StringSplitOptions.None)
Dim count = words.Length
gvW = rtbViewCode.SelectedText
Clipboard.SetText(gvW)
End Sub
我很好奇如何更改 System.Windows.Forms 以便我可以点击 RTB。
问题如何 select RTB 中的文本并使用鼠标将该文本复制到剪贴板?
我也试过这个代码:
Public Sub RightMouse_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim start = rtbViewCode.SelectionStart
Dim substring = rtbViewCode.Text.Substring(0, start)
Dim words = substring.Split(New String() {" ", vbCrLf}, StringSplitOptions.None)
Dim count = words.Length
MsgBox("Len " & count)
lblMsg.Text = count.ToString()
'gvW = words.ToString
'gvW = rtbViewCode.SelectedText
'Clipboard.SetText(gvW)
Clipboard.SetText(rtbViewCode.SelectedRtf, TextDataFormat.Rtf)
MsgBox("here " & gvW)
End Sub
我认为您最好使用 ContextMenuStrip。无论如何,您可以使用自定义控件捕获 WM_LBUTTONDOWN
并在按下鼠标左键时执行复制,有一个活动选择并且鼠标指针位于选择内。
在这种情况下,您抑制 消息,因此不会删除选择。
如果要在将焦点移动到其他控件时保持选择可见,请设置 HideSelection = False
。
如果这不是预期的行为,请更改 IsMouseDownInsideSelection()
方法或 WM_LBUTTONDOWN
中的 逻辑 。
Public Class RichTextBoxEx
Inherits RichTextBox
Private Const WM_LBUTTONDOWN As Integer = &H201
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = WM_LBUTTONDOWN Then
If SelectionLength > 0 AndAlso IsMouseDownInsideSelection() Then
Copy()
Return
End If
End If
MyBase.WndProc(m)
End Sub
Private Function IsMouseDownInsideSelection() As Boolean
Dim charIdx = GetCharIndexFromPosition(PointToClient(MousePosition))
If charIdx >= SelectionStart AndAlso charIdx <= (SelectionStart + SelectionLength) Then Return True
Return False
End Function
End Class
您可以使用 Clipboard.SetText(RichTextBox1.Text)
功能将所有文本复制到剪贴板