.net - 在 VB.NET for WinForms 的禁用文本框中启用滚动条

标签 .net vb.net winforms textbox scroll

我试图允许在多行文本框中滚动,即使文本框设置为

textbox.Enabled = False

这是不可能的,因为滚动条也被Enabled-Command 禁用了。

这里默认的方案是设置

textbox.ReadOnly = True
textbox.Enabled = True

但这对我来说并没有什么用。使用 ReadOnly,我仍然可以选择 TextBox 的文本并将光标放在其中。但是因为我有正常的(非 Multiline-TextBoxes)和同一表单上的其他控件,所以我不希望这种情况发生。我希望具有与所有其他禁用的文本框完全相同的行为。

对于其他一切,比如模仿禁用文本框的颜色等,ReadOnly 属性有一个合法的解决方法,但我找不到任何用于选择文本和放置光标。

更新:

根据 here 的一些提示我尝试使用 WIN32 API,但它没有按预期工作:

Imports System.Windows.Forms
Imports System.Runtime.InteropServices

Public Class TestTextBox
    Inherits TextBox

    Private Class Native
        <DllImport("user32.dll")> _
        Friend Shared Function EnableScrollBar(ByVal hWnd As IntPtr, ByVal wSBflags As UInteger, ByVal wArrows As UInteger) As Boolean
        End Function
        <DllImport("User32.dll")> _
        Friend Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As UInteger, ByVal wparam As Integer, ByVal lparam As Integer) As Integer
        End Function

        Public Const WM_SETREDRAW As Long = &HB
        Public Const ESB_ENABLE_BOTH As UInteger = 0
        Public Const SB_VERT As UInteger = 1
    End Class

    Public Sub Change() 'Gets called by a Button in my example.
        'Native.SendMessage(Me.Handle, Native.WM_SETREDRAW, New IntPtr(0), IntPtr.Zero)
        Native.EnableScrollBar(Me.Handle, Native.SB_VERT, Native.ESB_ENABLE_BOTH)
        'Native.SendMessage(Me.Handle, Native.WM_SETREDRAW, New IntPtr(1), IntPtr.Zero)
        Me.PerformLayout()
    End Sub

End Class

最佳答案

我认为这应该可行。 HideCaret 确保插入符号在文本框为只读的情况下隐藏。其他 WM 拦截阻止用户使用鼠标或键盘选择任何内容。

Imports System.Runtime.InteropServices

Public Class CustomTextbox
    Inherits System.Windows.Forms.TextBox

    Private Const WM_KEYDOWN = &H100
    Private Const WM_SYSKEYDOWN = &H104
    Private Const WM_MOUSEMOVE = &H200

    <DllImport("user32.dll")> _
    Private Shared Function HideCaret(ByVal hwnd As IntPtr) As Integer
    End Function

    Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
        If Me.ReadOnly Then HideCaret(Me.Handle)
        MyBase.OnGotFocus(e)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If Me.ReadOnly And (m.Msg = WM_MOUSEMOVE) Or _
                           (m.Msg = WM_KEYDOWN) Or _
                           (m.Msg = WM_SYSKEYDOWN) Then Exit Sub
        MyBase.WndProc(m)
    End Sub
End Class

关于.net - 在 VB.NET for WinForms 的禁用文本框中启用滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10873583/

相关文章:

.net - Azure QueueTriggered Function 应用程序与 keyvault 的点网隔离输入绑定(bind)

vb.net - 使用MessageDialog弹出UWP-VB错误消息

vb.net - 为什么饱和度和色调的最大值分别为 240 和 239?

VB.NET 应用程序卡住且未运行

c# - 使用不同的参数重新加载表单 c#

c# - 在绘画应用程序中保存图像 C#

c# - dot.Net 委托(delegate)有多少种方法?

.net - 如何在搜索引擎中索引您的 Silverlight 应用程序?

c# - 如何在 WPF 应用程序的触摸屏上自然滚动列表框?

c# - 具有 WinForm 和控制台界面的 .Net 程序