如何解决有没有办法在 RichTextBox 上禁用鼠标单击?
我正在使用可见的 RitchTextBox 来编写自动日志,但我不希望用户更改光标位置。我不能仅仅禁用控件,因为它会丢失背景颜色(当日志已满时,它会保存为 RTF 文件)。
我已经设置了 ReadOnly = True
和 ShorcutsEnabled = False
。
我的代码:
Protected Friend Sub PrintPort(ByVal NewText As String,Optional ByVal ForeColor As Color = Nothing,Optional ByVal NewLine As Boolean = True)
If Me.InvokeRequired Then
Dim Txt As New PrintSmsLogDelegate(AddressOf PrintPort)
Me.BeginInvoke(Txt,NewText,ForeColor,NewLine)
Else
If ClearLogFl Then
ClearLogFl = False
Me.RTB1.Clear()
End If
If NewText.Length < 1 Then
Return
End If
If ForeColor = Nothing Then
ForeColor = Color.White
End If
If NewLine Then
If Me.RTB1.TextLength > 1 Then
NewText = vbCrLf + NewText
End If
End If
Me.RTB1.SelectionColor = ForeColor 'Set color
Me.RTB1.SelectedText = NewText 'Add text
If Me.LogAutoScrollChk.Checked And NewText.Contains(vbLf) Then
Me.RTB1.ScrollToCaret()
End If
End If
End Sub
解决方法
一个例子,使用一个线程定时器(System.Timers.Timer
)来模拟从一个线程而不是 UI 线程调用的方法。
RichTexBox 需要拒绝用户交互:文本或插入符号位置都不能修改,用户不能干扰滚动过程,无论是否激活。
-
我们可以将 RichTextBox 设置为
ReadOnly
并删除滚动条(实际上这些都不是必需的,但它是更好的选择,IMO)。 -
在 RichTextBox 的
Enter
事件中,Form.ActiveControl 设置为null
(Nothing
),因此 RichTextBox 不是 {{1}再,因此它不会接收键盘或鼠标输入。
请注意,使用此设置,即使 RTB 是表单中唯一可以接收焦点的控件,也没有机会直接与其交互。 -
由于您的
ActiveControl
方法显然是从另一个线程调用的,您需要调用 UI 线程以附加到控件。
BeginInvoke() 可以简化调用过程,使用 Lambda 作为 Action 委托。
无需检查PrintPort()
,InvokeRequired
也可以从执行调用的同一线程(UI 线程)安全地调用。
BeginInvoke()
,
您可以为此制作自己的 RichTextBox。我在 make richtextbox not respond to mouse events 中转换了 c# 答案并添加了 Paging 键的处理:
Public Class DisplayBox
Inherits RichTextBox
Private Const WM_SETFOCUS As Integer = &H7
Private Const WM_ENABLE As Integer = &HA
Private Const WM_SETCURSOR As Integer = &H20
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If Not (m.Msg = WM_SETFOCUS OrElse m.Msg = WM_ENABLE OrElse m.Msg = WM_SETCURSOR) Then
MyBase.WndProc(m)
End If
End Sub
Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
If (e.KeyCode = Keys.PageDown Or e.KeyCode = Keys.PageUp) Then
e.Handled = True
End If
MyBase.OnKeyDown(e)
End Sub
End Class
在设置 ReadOnly = True
和 ScrollBars = None
属性时有效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。