0

在我的用户控件中,我想阻止用户选择文本,我的意思是我想取消(忽略)所有鼠标事件,我已经覆盖了重要事件,但似乎什么也没做,因为我仍然可以选择文本控制。

PS:不是我禁用控件以防止选择的选项,我想禁用选择。

Public Class RichTextLabel : Inherits RichTextBox

    Private Declare Function HideCaret Lib "user32" (ByVal hwnd As IntPtr) As Integer

    Public Sub New()
        Me.TabStop = False
        Me.Cursor = Cursors.Default
        Me.Size = New Point(200, 20)
        Me.ReadOnly = True
        Me.BorderStyle = BorderStyle.None
        Me.ScrollBars = RichTextBoxScrollBars.None
    End Sub

    Public Sub Add_Colored_Text(ByVal text As String, _
                                ByVal color As Color, _
                                Optional ByVal font As Font = Nothing)

        Dim index As Int32 = Me.TextLength
        Me.AppendText(text)
        Me.SelectionStart = index
        Me.SelectionLength = Me.TextLength - index
        Me.SelectionColor = color
        If font IsNot Nothing Then Me.SelectionFont = font
        Me.SelectionLength = 0

    End Sub

#Region " Overrided Events "

    Protected Overrides Sub OnClick(ByVal e As EventArgs)
        HideCaret(Me.Handle)
        Return
    End Sub

    Protected Overrides Sub OnSelectionChanged(ByVal e As EventArgs)
        HideCaret(Me.Handle)
        Return
    End Sub

    Protected Overrides Sub OnMouseClick(ByVal e As MouseEventArgs)
        HideCaret(Me.Handle)
        ' MyBase.OnClick(e)
        Return
    End Sub

    Protected Overrides Sub OnMouseDoubleClick(ByVal e As MouseEventArgs)
        HideCaret(Me.Handle)
        Return
    End Sub

    Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
        HideCaret(Me.Handle)
        Return
    End Sub

    Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
        HideCaret(Me.Handle)
        Return
    End Sub

#End Region

#Region " Handled Events "

    Private Sub On_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Me.MouseHover
        HideCaret(Me.Handle)
    End Sub

    Private Sub On_TextChanged(sender As Object, e As EventArgs) Handles Me.TextChanged
        HideCaret(Me.Handle)
    End Sub

#End Region

End Class
4

1 回答 1

1

有点hack,但至少它是一个干净的:

  • 向可以具有焦点的类添加元素
  • HideSelection = TrueTrue默认设置为,但请注意不要更改它)
  • 覆盖OnEnter事件以将焦点传递给子控件

这样,RichTextBox 永远不会保持焦点,因此即使它确实选择了文本,它也不会向用户显示。


Public Class RichTextLabel : Inherits RichTextBox

    Private controlToTakeFocus As New Label() With {
        .Width = 0,
        .Height = 0,
        .Text = String.Empty}

    Public Sub New()
        ' Default value is True, but is required for this solution
        'Me.HideSelection = True
    End Sub

    Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
        Me.Parent.Controls.Add(controlToTakeFocus)
        controlToTakeFocus.Focus()
    End Sub

End Class

编辑:控件controlToTakeFocus需要能够获得焦点,直到它位于Form. 在尝试赋予它焦点之前,我将覆盖的事件更改为OnMouseDown并添加了一行以将控件添加到父级。RichTextLabel可能有一个更好的地方,但这只是为了让它工作。

于 2013-07-05T23:32:11.763 回答