DOBON.NET DOBON.NETプログラミング掲示板過去ログ

テキストボックスで最下行が表示されているか判断する方法

環境/言語:[VB.NET2008SP1 .NETFramework3.5SP1]
分類:[.NET]

TextBoxにリアルタイムに発生する事象をログとして表示しているのですが、
過去に発生した事象を見ている時に新たに事象が発生した場合、ログを最下行に
追記し、最下行が表示されるようスクロールしているために、見ている途中で
スクロールしてしまいます。

そこで、最下行が画面上に表示されていないときに、TextBoxへの追記のみとし、
最下行へのスクロールを行わないようにしたいのですが、最下行が表示されているか
判断する方法が分かりません。

最下行が画面上に表示されているか判断するにはどのようにすればよいのでしょうか?
■No29054に返信(まりもんさんの記事)

こんな感じでどうでしょう?

    Dim pt = TextBox1.GetPositionFromCharIndex(TextBox1.TextLength - 1)
    Dim fheight = TextBox1.Font.Height
    pt = New Point(pt.X, pt.Y + fheight)
    If TextBox1.DisplayRectangle.Contains(pt) Then
        MessageBox.Show("最下行が見えてます")
    Else
        MessageBox.Show("最下行が見えてません")
    End If
■No29055に返信(shuさんの記事)
> ■No29054に返信(まりもんさんの記事)
> 
> こんな感じでどうでしょう?
> 
>     Dim pt = TextBox1.GetPositionFromCharIndex(TextBox1.TextLength - 1)
>     Dim fheight = TextBox1.Font.Height
>     pt = New Point(pt.X, pt.Y + fheight)
>     If TextBox1.DisplayRectangle.Contains(pt) Then
>         MessageBox.Show("最下行が見えてます")
>     Else
>         MessageBox.Show("最下行が見えてません")
>     End If
> 

ご返答ありがとうございます。
提示していただいたコードで、最下行が表示されているか判断できました。

ただ、最下行が表示されていない時の行の追加時に、一番上の行に表示が移動
してしまったので、どうにかしようと調べた結果、APIにて表示されている行に
戻すことになり、下記のようなAPIにて処理するようなコードにしました。

    Private Sub TextAppend(ByVal Message As String)
        '現在表示している先頭行を取得
        Dim NowLine As Integer = _
                SendMessage(TextBox1.Handle, EM_GETFIRSTVISIBLELINE, 0, 0)

        '表示できる行数を取得(行間の考慮なし)
        Dim ViewMaxLines As Integer = _
                TextBox1.DisplayRectangle.Height / TextBox1.Font.Height

        '最大行数に達したか
        If TextBox1.Lines.Length > 100 Then
            '最初の1行を消す
            TextBox1.Text = TextBox1.Text.Remove(0, TextBox1.Lines(0).Length + 2)
        End If

        '最下行が見えているか判断
        If (TextBox1.Lines.Length - NowLine) <= ViewMaxLines Then
            'テキストボックスに1行追加
            TextBox1.AppendText(Message & vbCrLf)
        Else
            'テキストボックスに1行追加
            TextBox1.Text += Message & vbCrLf

            '最初に表示されていた行までスクロール
            SendMessage(TextBox1.Handle, EM_LINESCROLL, 0, NowLine)
        End If
    End Sub


期待していた動作を実装できたので、これにて解決済みとさせていただきます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板