午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

コンボボックス、テキストボックス、ピクチャーボックスで文字列の改行表示テスト

改行を含めた文字列を

コンボボックス、テキストボックス、文字の描画の3つで表示

イメージ 4
 
イメージ 1

イメージ 2
動作は
TextBox1に文字列を入力してButton1を押すと
ComboBox1に文字列がリストに追加されていく
そのリストから文字列を選択するとその文字列が
TextBox2とPictureBox1に表示される
 
TextBox1と2はプロパティのMultilimeをTrueにするだけで改行した複数行の
文字列を表示することができる、長い文字列が右端に到達すると折り返されて表示される、これは表示だけで改行はされていない
ComboBoxは見た目では改行が表示されないので複数行の表示はできないけど
改行自体は保存されているみたいで、ComboBoxの表示文字列をTextBoxに
表示するとしっかり改行される
 
Public Class Form1

    'ボタンを押したらTextBox1内の文字列をコンボボックスに追加
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim str As String = Me.TextBox1.Text
        If str = "" Then Exit Sub

        Me.ComboBox1.Items.Add(str)

    End Sub
    'コンボボックスの項目を変更したら画像を表示
    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        Dim str As String = Me.ComboBox1.Text
        If str = "" Then Exit Sub

        Me.TextBox2.Text = str
        Call DrawString()

    End Sub
    Private Sub DrawString()
        Dim str As String = Me.TextBox2.Text '描画する文字列
        'str = Me.ComboBox1.Text'これでもしっかり改行される

        Dim myfont As New Font("Meiryo UI", 20) 'フォント作成
        Dim canvas As New Bitmap(1, 1) '適当な大きさのBitmap
        Dim g As Graphics = Graphics.FromImage(canvas) 'Graphicsオブジェクト
        Dim drawSizeF As SizeF
        Dim sFormat As New StringFormat
        Dim p As New PointF(0, 0) '描画開始位置、左上
        sFormat.FormatFlags = StringFormatFlags.NoClip '縦書とか設定するときに使う

        '描画される四角形範囲サイズを取得してから文字列を描画
       
        drawSizeF = g.MeasureString(str, myfont, p, sFormat) 'サイズ取得!
        
        canvas = New Bitmap(CInt(drawSizeF.Width), CInt(drawSizeF.Height)) '取得したサイズで改めてBitmap作成
        g = Graphics.FromImage(canvas)
        g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias '文字の描画のアンチエイリアスon
        Dim rectF As New RectangleF(p, drawSizeF) '描画範囲=取得したサイズに指定
        
        g.DrawString(str, myfont, Brushes.Aqua, rectF, sFormat) '描画範囲を指定して文字の描画!
        

        '描画範囲の目安になる赤枠用
        Dim rect As Rectangle = Rectangle.Round(rectF)
        rect.Size = New Size(rect.Width - 1, rect.Height - 1)
        g.DrawRectangle(Pens.Red, rect) '赤枠描画

        Me.PictureBox1.Image = canvas '描画した画像をPictureBox1に表示

        '後片付け
        g.Dispose()
        myfont.Dispose()
        sFormat.Dispose()

    End Sub
End Class
 
 
 
イメージ 3
画像で
 
文字の描画範囲(四角形)を測るところの
drawSizeF = g.MeasureString(str, myfont, p, sFormat) 'サイズ取得!
今のPixtack紫陽花の文字の描画ではここを
drawSizeF = g.MeasureString(str, myfont, 3000, sFormat) 'サイズ取得!
ってかいている
3000は横幅の最大値で横3000ピクセルを超えた描画部分は切り捨てにしている
今回のpは描画の起点座標をPoint(0,0)に指定している
これだと切り捨てられることはないからこっちのほうがいいかなあ
 
文字の描画部分
 g.DrawString(str, myfont, Brushes.Aqua, rectF, sFormat) '描画範囲を指定して文字の描画!
改行した状態の文字列をそのまま描画する時は描画範囲にRectangleを指定すれば
いいだけみたい、楽ちん
 
テストはうまく行った
 
参照したところ
 
 
 
2日後