前提・実現したいこと
VB.NET、Windows Formを使用しています。
スクロールバーつきのテキストボックスを自動でスクロールさせたいです。
(一番上からゆっくり下へスクロールさせ、一番下まで行ったら一番上に戻ってほしい)
発生している問題・エラーメッセージ
実装方法が分からないです。
現状としましては、
1秒ごとにタイマー回す(実装済み)
→テキストボックスに縦スクロールバーが無かったらメソッド抜ける(未実装)
→現在のアクティブなコントロールを取得(実装済み)
→動かしたいテキストボックスをアクティブにする(実装済み)
→テキストボックスのキャレットのある行数を取得(実装済み)
※ こちらの「物理的に行を数える」を参考
→キャレットを動かす(現在の行+1の行へキャレットを動かす。一番下の行だったら一番上の行へ移動)(未実装)
→キャレットの場所へスクロールを移動させる(実装済み)
→元々アクティブだったコントロールへアクティブを移す(実装済み)
という流れを実装しようとしたのですが、太字の部分が分からない状態です。
ヒントや参考になるサイトはございませんでしょうか?
そもそも、もっと簡単に要件が実装できるのであればご教授いただけますと幸いです。
※要件
- 文字を表示する
- 文字がフォームサイズに収まらなかったら縦スクロールバーが表示される
- スクロールバーがあれば、ゆっくりとスクロールバーが下へ動く
- 一番下までスクロールされたら一番上に戻る
該当のソースコード
VB
1 <System.Runtime.InteropServices.DllImport("User32.Dll")> 2 Private Shared Function SendMessage( 3 ByVal hWnd As IntPtr, 4 ByVal Msg As Integer, 5 ByVal wParam As Integer, 6 ByVal lParam As Integer) As Integer 7 End Function 8 9 Private Sub tmrTest_Tick(sender As Object, e As EventArgs) Handles tmrTest.Tick 10 'テキストボックスに縦スクロールバーが無かったらメソッド抜ける 11 12 '現在のアクティブなコントロールを取得 13 Dim control As Control = Me.ActiveControl 14 15 '動かしたいテキストボックスをアクティブにする 16 Me.ActiveControl = txtTest 17 18 '現在キャレットがある行数を取得 19 Const EM_LINEFROMCHAR As Integer = &HC9 20 Dim row As Integer = SendMessage( 21 txtTest.Handle, EM_LINEFROMCHAR, -1, 0) + 1 22 23 'ここで現在の行+1の行・もしくは先頭行へキャレットを動かしたい 24 'txtTest.Select() 25 26 'キャレットの場所へスクロールを移動させる 27 txtPreparationMethod.ScrollToCaret() 28 29 '元々アクティブだったコントロールへアクティブを移す 30 Me.ActiveControl = control 31 32 End Sub 33
試したこと
上記が全てです。
補足情報(FW/ツールのバージョンなど)
.NET Framework 4.0 Client Profile
情報が不足していたらご指摘いただけますと幸いです。
###追記
以下、修正した内容です。
VB
1 <System.Runtime.InteropServices.DllImport("User32.Dll")> 2 Private Shared Function SendMessage( 3 ByVal hWnd As IntPtr, 4 ByVal Msg As Integer, 5 ByVal wParam As Integer, 6 ByVal lParam As Integer) As Integer 7 End Function 8 9 <System.Runtime.InteropServices.DllImport("User32.Dll")> 10 Private Shared Function MakeWParam( 11 ByVal download As Integer, 12 ByVal hiWord As Integer) As Integer 13 End Function 14 15 Private Sub tmrTest_Tick(sender As Object, e As EventArgs) Handles tmrTest.Tick 16 Dim control As Control = Me.ActiveControl 17 18 Me.ActiveControl = txtTest 19 20 Const EM_LINEFROMCHAR As Integer = &HC9 21 Const EM_SCROLL As Integer = &HB5 22 Const SB_THUMBPOSITION As Integer = 4 23 24 Dim row As Integer = SendMessage(txtTest.Handle, EM_LINEFROMCHAR, -1, 0) + 1 25 26 SendMessage(txtTest.Handle, EM_SCROLL, MakeWParam(SB_THUMBPOSITION, row), 0)'ここで例外が出る 27 28 txtTest.Select() 29 30 txtTest.ScrollToCaret() 31 32 Me.ActiveControl = control 33 End Sub
以下、例外の内容です。
VB
1System.EntryPointNotFoundException: 'DLL 'User32.Dll' の 'MakeWParam' というエントリ ポイントが見つかりません。'
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/08 07:34
2019/04/08 07:48