我有一个RichTextBox,我需要找到垂直滚动条的位置。

没有Pinvoke有没有办法做到这一点?如果没有,有什么方法可以用Pinvoke做到这一点?

我需要返回一个整数值。

感谢您的帮助!

有帮助吗?

解决方案

如果没有PInvoke,我不知道如何做到这一点。您可以使用PInvoke来调用 GetScrollPos

以下是您可以尝试的方法。

步骤1:通过扩展标准RichTextBox创建自定义RichTextBox控件。

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

Namespace WindowsFormsApplication1

    Public Class MyRichTextBox
        Inherits RichTextBox
        <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
        Public Shared Function GetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer) As Integer
        End Function

        <DllImport("user32.dll")> _
        Private Shared Function SetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer, ByVal nPos As Integer, ByVal bRedraw As Boolean) As Integer
        End Function

        Private Const SB_HORZ As Integer = &H0
        Private Const SB_VERT As Integer = &H1

        ''' <summary>
        ''' Gets and Sets the Horizontal Scroll position of the control.
        ''' </summary>
        Public Property HScrollPos() As Integer
            Get
                Return GetScrollPos(DirectCast(Me.Handle, IntPtr), SB_HORZ)
            End Get
            Set(ByVal value As Integer)
                SetScrollPos(DirectCast(Me.Handle, IntPtr), SB_HORZ, value, True)
            End Set
        End Property

        ''' <summary>
        ''' Gets and Sets the Vertical Scroll position of the control.
        ''' </summary>
        Public Property VScrollPos() As Integer
            Get
                Return GetScrollPos(DirectCast(Me.Handle, IntPtr), SB_VERT)
            End Get
            Set(ByVal value As Integer)
                SetScrollPos(DirectCast(Me.Handle, IntPtr), SB_VERT, value, True)
            End Set
        End Property
    End Class
End Namespace

这将为标准RichTextBox添加两个属性:HScrollPos和VScrollPos。这些属性允许您在控件中获取并设置水平和垂直滚动条位置。

第2步:创建一个测试表单并试用您的控件。

在与自定义控件相同的项目中创建Winform。将自定义控件放在测试表单中,然后在表单上添加一个按钮。在表单的Click事件中,添加以下代码以查看自定义控件的垂直滚动位置。

Console.WriteLine(myRichTextBox1.VScrollPos)

要注意的一些事项:

  1. 如果您的控件当前不是 显示垂直滚动条, 打电话给HScrollPos会让你崩溃 程序。显然有一些 解决这个问题的方法(检查一下) 之前正在显示滚动条 检查财产,或制作 垂直滚动条始终可见,等等。)

  2. 取决于控件的方式(和     可能的形式)大小(不是     提及文本内容的变化     控制),设置     VScrollPos可能会导致您的程序崩溃或     不能将它恢复到它的位置     是在VScrollPos值的时候     保存。

  3. 我从未使用过此代码。一世     以为你的问题是     有趣并做了一点点     研究得出我的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top