代码之家  ›  专栏  ›  技术社区  ›  Anders

当内容超出边界C时,在文本框中显示滚动条#

  •  22
  • Anders  · 技术社区  · 17 年前

    只有当文本框中的行数大于显示的行数时,才能显示/隐藏文本框中的滚动条吗?

    4 回复  |  直到 17 年前
        1
  •  33
  •   Austin Salonen gmlacrosse    17 年前

    考虑使用 RichTextBox --它有这种内在的行为。

        2
  •  8
  •   dummy    12 年前
    Public Class TextBoxScrollbarPlugin
        Private WithEvents mTarget As TextBox
    
        ''' <summary>
        ''' After the Handle is created, mTarget.IsHandleCreated always returns
        ''' TRUE, even after HandleDestroyed is fired.
        ''' </summary>
        ''' <remarks></remarks>
        Private mIsHandleCreated As Boolean = False
    
        Public Sub New(item As TextBox)
            mTarget = item
            mIsHandleCreated = mTarget.IsHandleCreated
        End Sub
    
        Private Sub Update()
            If Not mTarget.IsHandleCreated Then
                Return
            ElseIf Not mIsHandleCreated Then
                Return
            End If
            Dim textBoxRect = TextRenderer.MeasureText(mTarget.Text,
                                                       mTarget.Font,
                                                       New Size(mTarget.Width, Integer.MaxValue),
                                                       TextFormatFlags.WordBreak + TextFormatFlags.TextBoxControl)
    
            Try
                If textBoxRect.Height > mTarget.Height Then
                    mTarget.ScrollBars = ScrollBars.Vertical
                Else
                    mTarget.ScrollBars = ScrollBars.None
                End If
            Catch ex As System.ComponentModel.Win32Exception
                'this sometimes throws a "failure to create window handle"
                'error.
                'This might happen if the TextBox is unvisible and/or
                'to small to display a toolbar.
                If mLog.IsWarnEnabled Then mLog.Warn("Update()", ex)
            End Try
        End Sub
    
        Private Sub mTarget_HandleCreated(sender As Object, e As System.EventArgs) Handles mTarget.HandleCreated
            mIsHandleCreated = True
        End Sub
    
        Private Sub mTarget_HandleDestroyed(sender As Object, e As System.EventArgs) Handles mTarget.HandleDestroyed
            mIsHandleCreated = False
        End Sub
    
        Private Sub mTarget_SizeChanged(sender As Object, e As System.EventArgs) Handles mTarget.SizeChanged
            Update()
        End Sub
    
        Private Sub mTarget_TextChanged(sender As Object, e As System.EventArgs) Handles mTarget.TextChanged
            Update()
        End Sub
    
    End Class
    
    
    Private mPlugins As New List(Of Object)
    Private Sub Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        mPlugins.Add(New TextBoxScrollbarPlugin(txtBoxOne))
        mPlugins.Add(New TextBoxScrollbarPlugin(txtBoxTwo))
        mPlugins.Add(New TextBoxScrollbarPlugin(txtBoxThree))
    End Sub  
    
        3
  •  7
  •   tnimas    11 年前

    谢谢你,笨蛋,这很有效!这里是c语言中虚拟答案的简短版本#

    Size textBoxRect = TextRenderer.MeasureText(
        this.YourTextBox.Text, 
        this.YourTextBox.Font, 
        new Size(this.YourTextBox.Width, int.MaxValue),
        TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl);
    try
    {
        this.YourTextBox.ScrollBars = textBoxRect.Height > this.YourTextBox.Height ? 
            ScrollBars.Vertical : 
            ScrollBars.None;
    } catch (System.ComponentModel.Win32Exception)
    {
         // this sometimes throws a "failure to create window handle" error.
         // This might happen if the TextBox is unvisible and/or
         // too small to display a toolbar.
    }
    
        4
  •  0
  •   James Pusateri    11 年前

    我已经在vb中使用了tnimas解决方案。函数写得很好,我没有看到错误。

        Private Sub TextBoxSizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged
        Dim textBoxRect As Size = TextRenderer.MeasureText(TextBox.Text, TextBox.Font, New Size(TextBox.Width, Integer.MaxValue), TextFormatFlags.WordBreak Or TextFormatFlags.TextBoxControl)
        Try
            TextBox.ScrollBar = If(textBoxRect.Height > TextBox.Height, ScrollBars.Vertical, ScrollBars.None)
        Catch ex As Exception
            'handle error
        End Try
    End Sub
    
        5
  •  0
  •   Pyon    6 年前

    Size textBoxRect = TextRenderer.MeasureText(YourTextBox.Text, YourTextBox.Font, new Size(YourTextBox.Width, int.MaxValue), TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl);
    
    WinApi.ShowScrollBar(YourTextBox.Handle, (int)WinApi.ScrollBar.SB_VERT, textBoxRect.Height > YourTextBox.Height ? true : false);
    

    此方法不会导致异常,但应注意,这样隐藏滚动条将禁用滚动消息,但如果您只是在文本区域无法滚动时隐藏滚动条,则此方法没有问题。