将垂直滚动条的位置获取为vb.net中的整数

问题描述 投票:2回答:2

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

如果没有Pinvoke,有什么方法可以做到这一点?如果没有,使用Pinvoke进行此操作的方法是什么?

我需要返回一个整数值。

感谢您的帮助!

vb.net richtextbox scrollbar
2个回答
3
投票

没有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. 我从未使用过此代码。一世以为你的问题是有趣,做了一点研究得出我的答案。


0
投票

是的,Jay的解决方案实现了所承诺的:它改变了滚动条的位置。它不变的是richtextbox的CONTENT的位置。

这是我在codeproject.com上找到的解决方案:https://www.codeproject.com/Questions/293542/VB-Net-Custome-RichTextBox-SetScrollPos

Public Class Rtbscrollfix
    Inherits RichTextBox

    <DllImport("user32.dll")>
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByRef lParam As System.Drawing.Point) As Integer
    End Function

    Private Const WM_USER = &H400
    Private Const EM_GETSCROLLPOS = WM_USER + 221
    Private Const EM_SETSCROLLPOS = WM_USER + 222

    Public Property ScrollY() As Integer
        Get
            Dim pt As New System.Drawing.Point
            SendMessage(Me.Handle, EM_GETSCROLLPOS, 0, pt)
            Return pt.Y
        End Get
        Set(value As Integer)
            SendMessage(Me.Handle, EM_SETSCROLLPOS, 0, New System.Drawing.Point(0, value))
        End Set
    End Property

End Class
© www.soinside.com 2019 - 2024. All rights reserved.