忍者ブログ
ブログ主が仕事や個人的に学んだPC系・プログラミング系(VBAとかHTML)について書いていく備忘録ブログ。 ※ここで記載する内容はあくまで「個人的に」上手くいく内容です。ご使用には十分注意してください
[2] [20] [40] [39] [38] [37] [36] [35
Posted by - 2020.07.04,Sat
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Posted by 若槻風亜 - 2019.10.20,Sun

(対象)VS2017(Visual Studio/VB.NET)


ネットで探しても中々ズバリこれ、というのが
出てこなかったのでまとめてみます。

タイトル通り、VS/VBでリッチテキストボックスの
指定行に移動するソースサンプル。

実際の動作はこちらのファイルを参照


――――――――――――――――――――――――――――――――
    '■リッチテキストボックスのスクロール用
    Public Declare Function SendMessage Lib "USER32.dll" Alias "SendMessageA" (
           ByVal hWnd As System.IntPtr, ByVal Msg As Int32,
           ByVal wParam As Int32, ByRef lParam As Point) As IntPtr

    Public Declare Function SendMessage2 Lib "USER32.dll" Alias "SendMessageA" (
        ByVal hWnd As IntPtr, ByVal msg As UInteger, ByVal wParam As Integer,
        ByVal lParam As Integer) As Integer
    Public EM_GETFIRSTVISIBLELINE As UInteger = 206
    Public EM_LINEINDEX As UInteger = 0
    Public Pos As Point
    Public I As Long
    Public J As Long
    Public K As Long
    Public Dbl1 As Double

    '===========================================================
    ' 移動押下時
    '===========================================================
    Private Sub Bt_移動_Click(sender As Object, e As EventArgs) Handles Bt_移動.Click
        '■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
        ' 右端で折り返してもしなくても移動可
        ' (RT_データ.WordWrap = False/True)
        '■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
        '■テキストの中身が数字じゃない場合は処理を抜ける
        If Not IsNumeric(Text_移動先.Text) Then
            MsgBox("移動先番号は数字で入力してください", vbExclamation, "【注意】")
            Text_移動先.Select()
            Text_移動先.SelectAll()
            Exit Sub
        End If  '---入力値が数字かどうかの判断

        '■設定した数字を取得
        I = CLng(Text_移動先.Text)  '---Integerでもいい

        '■対象行があるかないかを判断
        J = RT_データ.Lines.Length
        If I > J Then _
            MsgBox("指定行が最大行よりも大きい値です", vbExclamation, "【注意】") : _
            Exit Sub

        '■行の高さを取得
        ' 参照 : https://dobon.net/vb/bbs/log3-52/30480.html
        With RT_データ
            Dbl1 = .GetPositionFromCharIndex(
                .GetFirstCharIndexFromLine(2)).Y -
                .GetPositionFromCharIndex(.GetFirstCharIndexFromLine(1)).Y
        End With

        '■対象行にジャンプ
        '  http://pineplanter.moo.jp/non-it-salaryman/2017/11/23/csharp-scroll-control/
        '  C#→VB変換 :http://www.carlosag.net/Tools/CodeTranslator/
        ' 変数の対応表:http://www.webtropy.com/articles/dll-api.aspx?dll=crypt32
        Pos = New Point(0, CInt((I - 1) * Dbl1))
        SendMessage(RT_データ.Handle, 1246, 0, Pos)

        '■対象行を選択
        '  https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8248&forum=7
        '-----先頭行を取得
        J = SendMessage2(RT_データ.Handle, EM_GETFIRSTVISIBLELINE, 0, CInt((I - 1) * Dbl1))
        '-----対象行を選択
        K = 0
        For cnt = 0 To J - 1
            K += Len(RT_データ.Lines(cnt).ToString)  '---指定行の文字列を取得
            K += 1  '---改行分を追加で加算
            'Debug.Print("K:String = " & K & ":" & RT1.Lines(cnt).ToString)
        Next
        RT_データ.SelectionStart = K
        RT_データ.Select()
    End Sub
――――――――――――――――――――――――――――――――

VS2017と2019でしか試してませんが、
恐らくVBの方でも使用可能かと。


拍手[0回]

PR
Comments
Post a Comment
Name :
Title :
E-mail :
URL :
Comments :
Pass :   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
プロフィール
HN:
若槻風亜
性別:
女性
職業:
会社員
趣味:
創作、プログラミング
自己紹介:
仕事や個人で学んだことをまとめておきたかったがために備忘録ブログを立ち上げました。
あくまで自分が学んだこと・自分が出来たことなので、ご覧くださる場合は参照レベルでお願いします。
ブログ内検索
カレンダー
06 2020/07 08
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
P R
最新トラックバック
コガネモチ
フリーエリア



Template by mavericyard*
Powered by "Samurai Factory"
忍者ブログ [PR]