テキストボックスに、秀丸のようにアンダーラインを引きたい。 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 トマト  (小学生)
投稿日時
2009/7/5 20:14:14
すいません。コードがわからないのですが、RichTextBoxでその行だけ下線をオンにすればできると思います。
すいません。ホントに・・・。
すいません。ホントに・・・。
投稿者 はなわ  (社会人)
投稿日時
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]
テキストボックスのカーソルのある行にアンダーラインを引きたいと思い、以下のプログラムを作ったのですが、
バックスペースキーやデリートキーを押したときなどに、ラインが再描画されて見にくくなってしまいます。
この状態を無くしたいので、何か知恵をお貸しください。
また簡単に出来る別の方法があれば、教えてください。
この関数は、テキストボックスの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]
リッチテキストボックスを使ってやってみます。