2012-06-03 28 views
2

我试图让在即使文本框设置为启用滚动条的文本框残疾人在VB.NET的WinForms的

textbox.Enabled = False 

这是不可能的一个多-文本框滚动,滚动栏是禁用启用 - 命令也一样。

这里的默认解决方案是设置

textbox.ReadOnly = True 
textbox.Enabled = True 

但是这并没有真正做的伎俩我。与只读我仍然可以选择文本框的文本以及将光标放在它的内部。但正如我正常(非Multiline -TextBoxes)和其他控件在同一表单上,我不希望发生这种情况。我想和所有其他禁用的TextBox具有完全相同的行为。

对于一切,就像一个残疾人文本框等的模仿色彩,没有与只读,物业合法的解决办法,但我coudn't找到任何选择文本,并把光标。

UPDATE:

随着一些提示从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 
+0

为什么你不使用固定大小的可滚动div来代替? –

+0

@pOcHa - 这不是我正在谈论的Web应用程序,而是Windows Forms应用程序。 –

+0

考虑添加一个适当的标签,因为它与您的标题或文本完全无法区分......并且仅将我以前的评论中的单词“div”替换为任何其他类型的容器 –

回答

2

我认为这应该工作。 HideCaret确保在文本框为ReadOnly的情况下插入符号被隐藏起来。其他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 
+0

我终于到处去测试这个解决方案。它对我来说工作得很好。非常感谢你。 –