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

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

TabControlコントロールのAlignmentプロパティをRightやLeftにしてタブを横側に表示すると、タブに表示されるテキストは横向きで縦に表示されます。ここでは、以下の画像のように、タブが横にあるときでもテキストを横書きで表示する方法を紹介します。

タブが横にあるときでもテキストが横書きのTabControl

TabControlのタブのテキストを常に横書きで表示するには、「TabControlのタブを自分で描画する」で紹介している方法で、タブを自分で描画します。

以下に、オーナードローによりTabControl1のタブのテキストを常に横書きする例を示します。

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

    'TabControlをオーナードローする
    TabControl1.DrawMode = TabDrawMode.OwnerDrawFixed
End Sub

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

    'StringFormatを作成
    Dim sf As New StringFormat()
    '水平垂直方向の中央に、行が完全に表示されるようにする
    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#
コードを隠すコードを選択
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, System.EventArgs e)
{
    //タブを左側に表示する
    TabControl1.Alignment = TabAlignment.Left;
    //タブのサイズを固定する
    TabControl1.SizeMode = TabSizeMode.Fixed;
    TabControl1.ItemSize = new Size(25, 80);

    //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.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();
}

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

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