DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

TabControlのタブのテキストを縦書きにする

TabControlコントロールのAlignmentプロパティをRightやLeftにしてタブを横側に表示している時に、タブに表示される文字列を縦書きにする方法を紹介します。

オーナードローによる方法

タブをオーナードローし、縦書きで描画する方法があります。タブのオーナードローについては「TabControlのタブを自分で描画する」で、縦書きについては「文字列を縦書きで描画する」で説明していますので、そちらをご覧ください。

以下にオーナードローによりタブのTextを縦書きにする例を示します。(TabControl.Alignmentプロパティに関係なく縦書きにしていることをご了承ください。)

タブのテキストが縦書きになったTabControl

VB.NET
コードを隠すコードを選択
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    'タブを右側に表示する
    TabControl1.Alignment = TabAlignment.Right
    'タブのサイズを固定する
    TabControl1.SizeMode = TabSizeMode.Fixed
    TabControl1.ItemSize = New Size(50, 20)

    'TabControlをオーナードローする
    TabControl1.DrawMode = TabDrawMode.OwnerDrawFixed
    'DrawItemイベントハンドラを追加
    AddHandler TabControl1.DrawItem, AddressOf TabControl1_DrawItem
End Sub

'TabControl1のDrawItemイベントハンドラ
Private Sub TabControl1_DrawItem(ByVal sender As Object, _
    ByVal e As DrawItemEventArgs)
    '対象のTabControlを取得
    Dim tab As TabControl = CType(sender, TabControl)
    Dim page As TabPage = tab.TabPages(e.Index)
    'タブページのテキストを取得
    Dim txt As String = page.Text

    'StringFormatを作成
    Dim sf As New StringFormat
    '縦書きにする
    sf.FormatFlags = StringFormatFlags.DirectionVertical
    'ついでに、水平垂直方向の中央に、行が完全に表示されるようにする
    sf.LineAlignment = StringAlignment.Center
    sf.Alignment = StringAlignment.Center
    sf.FormatFlags = sf.FormatFlags Or StringFormatFlags.LineLimit

    '背景の描画
    Dim backBrush As Brush = New SolidBrush(page.BackColor)
    e.Graphics.FillRectangle(backBrush, e.Bounds)
    backBrush.Dispose()

    'Textの描画
    Dim foreBrush As Brush = New SolidBrush(page.ForeColor)
    e.Graphics.DrawString(txt, page.Font, foreBrush, RectangleF.op_Implicit(e.Bounds), sf)
    foreBrush.Dispose()
End Sub
C#
コードを隠すコードを選択
//Form1のLoadイベントハンドラ
private void Form1_Load(object sender, System.EventArgs e)
{
    //タブを右側に表示する
    TabControl1.Alignment = TabAlignment.Right;
    //タブのサイズを固定する
    TabControl1.SizeMode = TabSizeMode.Fixed;
    TabControl1.ItemSize = new Size(50, 20);

    //TabControlをオーナードローする
    TabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
    //DrawItemイベントハンドラを追加
    TabControl1.DrawItem += new DrawItemEventHandler(TabControl1_DrawItem);
}

//TabControl1のDrawItemイベントハンドラ
private void TabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
    //対象のTabControlを取得
    TabControl tab = (TabControl) sender;
    TabPage page = tab.TabPages[e.Index];
    //タブページのテキストを取得
    string txt = page.Text;

    //StringFormatを作成
    StringFormat sf = new StringFormat();
    //縦書きにする
    sf.FormatFlags = StringFormatFlags.DirectionVertical;
    //ついでに、水平垂直方向の中央に、行が完全に表示されるようにする
    sf.LineAlignment = StringAlignment.Center;
    sf.Alignment = StringAlignment.Center;
    sf.FormatFlags |= StringFormatFlags.LineLimit;

    //背景の描画
    Brush backBrush = new SolidBrush(page.BackColor);
    e.Graphics.FillRectangle(backBrush, e.Bounds);
    backBrush.Dispose();

    //Textの描画
    Brush foreBrush = new SolidBrush(page.ForeColor);
    e.Graphics.DrawString(txt, page.Font, foreBrush, e.Bounds, sf);
    foreBrush.Dispose();
}

縦書きフォントを使用する方法

掲示板ではピラルクさんが縦書きフォントを使用する方法を紹介されています。オーナードローよりも簡単できれいに表示されます。ただし、タブが左にあるときは、文字が上下逆さになってしまい、この方法は使えません。

残念ながらこの方法は.NET Framework 1.1以前でしか有効でないようです。

VB.NET
コードを隠すコードを選択
TabControl1.Alignment = TabAlignment.Right

'縦書きのフォントにする
TabControl1.Font = New Font( _
    TabControl1.Font.FontFamily, _
    TabControl1.Font.Size, _
    TabControl1.Font.Style, _
    TabControl1.Font.Unit, _
    TabControl1.Font.GdiCharSet, _
    True)
C#
コードを隠すコードを選択
TabControl1.Alignment = TabAlignment.Right;

//縦書きのフォントにする
TabControl1.Font = new Font(
    TabControl1.Font.FontFamily,
    TabControl1.Font.Size,
    TabControl1.Font.Style,
    TabControl1.Font.Unit,
    TabControl1.Font.GdiCharSet,
    true);
  • 履歴:
  • 2010/8/29 縦書きフォントを使用する方法が.NET Framework 1.1以前でしか使用できないことを追記。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。