テキストボックスに、秀丸のようにアンダーラインを引きたい。

タグの編集
投稿者 はなわ  (社会人) 投稿日時 2009/7/4 08:52:34
VB2008ExpressEditonを使っています。
テキストボックスのカーソルのある行にアンダーラインを引きたいと思い、以下のプログラムを作ったのですが、
バックスペースキーやデリートキーを押したときなどに、ラインが再描画されて見にくくなってしまいます。
この状態を無くしたいので、何か知恵をお貸しください。
また簡単に出来る別の方法があれば、教えてください。

この関数は、テキストボックスのkeyupイベントで、呼び出されています。
変数plは、関数の外で、int16で宣言されています。
[code]
    Private Sub DrawLine()
        Dim g As Graphics = TextBox1.CreateGraphics
        Dim a, b, c, max, cl, CiCl As Int16
        Dim pt1, pt2, pt3, pt4, cp As Point
        CiCl = TextBox1.GetFirstCharIndexOfCurrentLine '現在の行の最初の文字のインデックスを取得します。
        cp = TextBox1.GetPositionFromCharIndex(CiCl) '指定した文字インデックスが示す、コントロール内の位置を取得します。
        cl = TextBox1.GetLineFromCharIndex(CiCl) 'コントロールのテキスト内の指定した文字位置から行番号を取得します。 
        a = cl - pl
        b = TextBox1.Font.Height
        c = TextBox1.Width
        max = (TextBox1.ClientSize.Height - 9) / b
        max = max * b + 1
        pt1 = cp + New Size(0, b)

        If TextBox1.Lines.GetUpperBound(0) = -1 Then
            pt1.Y = b + 1
        ElseIf pt1.X = 0 And TextBox1.Lines.GetUpperBound(0) > -1 Then
            pt1.Y = b * (TextBox1.Lines.GetUpperBound(0) + 1) + 1
            cl = TextBox1.Lines.GetUpperBound(0)
        End If

        pt1.X = 0

        If pt1.Y > max Then
            pt1.Y = max
        End If

        pt2 = pt1
        pt2.X = c - 25

        If cl <> pl Then
            pt3.X = 0 : pt3.Y = pt1.Y - a * b
            If pt3.Y > max Then
                pt3.Y = max
            End If
            pt4 = pt3 + New Size(c - 25, 0)
            g.DrawLine(Pens.White, pt3, pt4)
        End If

        g.DrawLine(Pens.Red, pt1, pt2)
        pl = cl
    End Sub
[/code]
投稿者 トマト  (小学生) 投稿日時 2009/7/5 20:14:14
すいません。コードがわからないのですが、RichTextBoxでその行だけ下線をオンにすればできると思います。
すいません。ホントに・・・。
投稿者 はなわ  (社会人) 投稿日時 2009/7/6 08:56:33
トマトさん、返答ありがとうございます。
リッチテキストボックスを使ってやってみます。