文字列を折り返して描画する (ワードラップした文字列を描画する) - C#

文字列を折り返して描画するコードを紹介します。

概要

長い文字列を指定した領域内で、ワードラップして文字列を描画したい場合があります。
この記事では、ワードラップした文字列を描画するコードを紹介します。
ワードラップした文字列を描画する方法として、GraphicsオブジェクトのDrawString メソッドを利用する方法と、 TextRendererクラスを利用する方法があります。

プログラム:Graphics.DrwaString メソッドを利用する方法

UI

下図のフォームを作成します。
フォームにPanelコントロールを配置します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DrawStringWordWrap
{
  public partial class FormWordWrapDraw : Form
  {
    public FormWordWrapDraw()
    {
      InitializeComponent();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
      Pen p = new Pen(Color.FromArgb(0x45,0x72,0xAA));
      Rectangle r = new Rectangle(128, 32, 128, 160);
      e.Graphics.DrawRectangle(p,r);

      string DrawText = "A big penguin dreams of climbing the highest mountain in the world.";
      Font f = new Font("Meiryo",10);
      SolidBrush b = new SolidBrush(Color.Black);
      e.Graphics.DrawString(DrawText, f, b, r);
    }
  }
}

解説

以下はテキストが描画される範囲の枠を描画するコードです。
  Pen p = new Pen(Color.FromArgb(0x45,0x72,0xAA));
  Rectangle r = new Rectangle(128, 32, 128, 160);
  e.Graphics.DrawRectangle(p,r);

画面に描画する文字列を用意します。
  string DrawText = "A big penguin dreams of climbing the highest mountain in the world.";

描画するフォントとブラシを作成します。
  Font f = new Font("Meiryo",10);
  SolidBrush b = new SolidBrush(Color.Black);

GraphicsオブジェクトのDrawStringメソッドを呼び出します。第四引数に描画領域となるRectangleオブジェクトを与えると、 Rectangleの領域のサイズに合わせてテキストがワードラップされて描画されます。
  e.Graphics.DrawString(DrawText, f, b, r);

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。枠の大きさに合わせてワードラップされて描画される動作が確認できます。

プログラム:TextRenderer.DrawText メソッドを利用する方法

UI

下図のフォームを作成します。
フォームにPanelコントロールを配置します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DrawStringWordWrap
{
  public partial class FormWordWrapDraw : Form
  {
    public FormWordWrapDraw()
    {
      InitializeComponent();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
      Pen p = new Pen(Color.FromArgb(0x45,0x72,0xAA));
      Rectangle r = new Rectangle(128, 32, 128, 160);
      e.Graphics.DrawRectangle(p,r);

      string DrawText = "A big penguin dreams of climbing the highest mountain in the world.";
      Font f = new Font("Meiryo",10);
      TextRenderer.DrawText(e.Graphics, DrawText, f, r, Color.Black, TextFormatFlags.WordBreak);
    }
  }
}

解説

以下はテキストが描画される範囲の枠を描画するコードです。
  Pen p = new Pen(Color.FromArgb(0x45,0x72,0xAA));
  Rectangle r = new Rectangle(128, 32, 128, 160);
  e.Graphics.DrawRectangle(p,r);

画面に描画する文字列を用意します。
  string DrawText = "A big penguin dreams of climbing the highest mountain in the world.";

描画するフォントを作成します。
  Font f = new Font("Meiryo",10);

TextRendererクラスの、DrwaTextメソッドを呼び出し画面にテキストを描画します。
第四引数にテキストを描画する領域を与え、TextFormatFlagsにTextFormatFlags.WordBreakを設定することで、文字列を両機の幅に合わせてワードラップして描画できます。
  TextRenderer.DrawText(e.Graphics, DrawText, f, r, Color.Black, TextFormatFlags.WordBreak);

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。枠の大きさに合わせてワードラップされて描画される動作が確認できます。


DrawStringメソッドの場合と同じフォント、フォントサイズを使用して描画していますが、描画結果が違うことがわかります。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2023-01-25
iPentec all rights reserverd.