- 題名: テキストボックスで最下行が表示されているか判断する方法
- 日時: 2011/09/15 13:54:12
- ID: 29054
- この記事の返信元:
- (なし)
- この記事への返信:
- [29055] Re[1]: テキストボックスで最下行が表示されているか判断する方法2011/09/15 15:39:37
- ツリーを表示
■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
期待していた動作を実装できたので、これにて解決済みとさせていただきます。
分類:[.NET]
TextBoxにリアルタイムに発生する事象をログとして表示しているのですが、
過去に発生した事象を見ている時に新たに事象が発生した場合、ログを最下行に
追記し、最下行が表示されるようスクロールしているために、見ている途中で
スクロールしてしまいます。
そこで、最下行が画面上に表示されていないときに、TextBoxへの追記のみとし、
最下行へのスクロールを行わないようにしたいのですが、最下行が表示されているか
判断する方法が分かりません。
最下行が画面上に表示されているか判断するにはどのようにすればよいのでしょうか?