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

テキストボックス、リッチテキストボックスで折り返し表示

環境/言語:[VB.NET 2005]
分類:[.NET]

こんにちは

初歩的なことかもしれませんが、教えてください。
テキストボックス、または、リッチテキストボックスにて、マルチラインが有効な時に、指定した横方向の文字数折り返し表示を実装したいと思っています。

たとえば、横方向は60文字(全角)で折り返すとした場合、コントロールの大きさにかかわらず、60文字で折り返して表示したいです。

WordWrapプロパティでは、文字数を指定できず、どういう風にコードを組み立てたらよいかが分かりません。

サンプルや参考になりそうな情報がありましたら、お教えいただけると助かります。

よろしくお願いいたします。
■No23606に返信(まだまだ初心者さんの記事)
> たとえば、横方向は60文字(全角)で折り返すとした場合、コントロールの大きさにかかわらず、60文字で折り返して表示したいです。
>

単純なのは文字数を数えて、改行コードを挿入なんだけど・・・
それでいいかというとそうでもない。

マルチラインが有効な場合、コントロールの幅より多く入力
した場合、自動的に見た目は改行されてはいるけど、
テキスト値には改行文字は含まれていないわけです。
任意に途中で改行を入れた場合は、改行文字は含まれます。

今回の場合は、幅より短く改行したいようなので、改行コード
を挿入すればいいかな。


複数行の表示 改行コードを挿入
http://homepage1.nifty.com/rucio/main/dotnet/ClassLibrary/L006_System.Windows.Forms.TextBox.htm

テキストボックスの複数行入力時の折り返しについて
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=27950
1つの方法として、見た目だけごまかす方法が使えそうです。
 ・枠線付きで背景が白いLabelをFormに配置
 ・そのLabelの枠内の左側領域に、枠線が無いTextBoxを配置
サンプルを書いてみました。参考になれば幸いです。
 
# 指定した文字数で折り返すTextBoxの横幅は、
  例えばGraphics.MeasureStringメソッドを使えば計算できます。
 
Public Class WordWrapTextBoxTestForm
    Inherits Form
 
    ' 巾の狭い、枠線無しTextBox
    Dim WithEvents TextBox1 As New TextBox
    ' 幅広の、枠線付きLabel
    Dim WithEvents Label1 As New Label
 
    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        Me.Text = Me.GetType.Name
        Me.ClientSize = New Size(500, 400)
  
       With Me.Label1
            .BackColor = SystemColors.Window
            .BorderStyle = BorderStyle.FixedSingle
            .AutoSize = False
            .Bounds = New Rectangle(100, 50, 350, 150)
        End With
 
        ' TextBoxを、Labelの枠線内の左側領域に配置する
        With Me.TextBox1
            .Text = New String("あ"c, 70)
            .Multiline = True
            .BorderStyle = BorderStyle.None
            .Width = 200 ' ←文字数にあわせて適切に設定してください
            .Location = New Point(Me.Label1.Left + SystemInformation.BorderSize.Width, _
                                  Me.Label1.Top + SystemInformation.BorderSize.Height)
            .Height = Me.Label1.Height - 2 * SystemInformation.BorderSize.Height
        End With
 
        Me.Controls.AddRange(New Control() {Me.TextBox1, Me.Label1})
        Me.TextBox1.BringToFront()
 
        MyBase.OnLoad(e)
    End Sub
End Class
やじゅ ファミリーさん、H.K.R. 付き人さん、貴重なアドバイス
ありがとうございました。

見た目で解決する方法は、目からうろこでした。

ありがとうございました。
■No23653に返信(まだまだ初心者さんの記事)
> やじゅ ファミリーさん、H.K.R. 付き人さん、貴重なアドバイス
> ありがとうございました。
>
> 見た目で解決する方法は、目からうろこでした。
>
> ありがとうございました。
解決済み!

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