質問

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つのプロパティが追加されます。これらのプロパティにより、コントロールの水平および垂直スクロールバーの位置を取得および設定できます。

ステップ2:テストフォームを作成して、コントロールを試してください。

カスタムコントロールと同じプロジェクトでWinformを作成します。テストフォームにカスタムコントロールをドロップし、フォームにボタンを追加します。フォームのClickイベントで、次のコードを追加して、カスタムコントロールの垂直スクロール位置を表示します。

Console.WriteLine(myRichTextBox1.VScrollPos)

注意すべき点:

  1. コントロールが現在ない場合 垂直スクロールバーを表示し、 HScrollPosを呼び出すとクラッシュします プログラム。明らかにいくつかあります これを回避する方法( スクロールバーは前に表示されています プロパティを確認するか、 垂直スクロールバーが常に表示されるなど)。

  2. コントロール(および     おそらくフォーム)サイズが(ない     テキストの内容の変更に言及する     コントロールの)、設定     VScrollPosはプログラムをクラッシュさせたり、     位置に復元しない     VScrollPos値が     保存しました。

  3. このコードは使用したことがありません。私     あなたの質問は     おもしろくて     私の答えを思い付くための研究。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top