vb.netで整数として垂直スクロールバーの位置を取得
-
06-07-2019 - |
質問
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)
注意すべき点:
-
コントロールが現在ない場合 垂直スクロールバーを表示し、 HScrollPosを呼び出すとクラッシュします プログラム。明らかにいくつかあります これを回避する方法( スクロールバーは前に表示されています プロパティを確認するか、 垂直スクロールバーが常に表示されるなど)。
-
コントロール(および おそらくフォーム)サイズが(ない テキストの内容の変更に言及する コントロールの)、設定 VScrollPosはプログラムをクラッシュさせたり、 位置に復元しない VScrollPos値が 保存しました。
-
このコードは使用したことがありません。私 あなたの質問は おもしろくて 私の答えを思い付くための研究。