TabControlコントロールのAlignmentプロパティをRightやLeftにしてタブを横側に表示している時に、タブに表示される文字列を縦書きにする方法を紹介します。
タブをオーナードローし、縦書きで描画する方法があります。タブのオーナードローについては「TabControlのタブを自分で描画する」で、縦書きについては「文字列を縦書きで描画する」で説明していますので、そちらをご覧ください。
以下にオーナードローによりタブのTextを縦書きにする例を示します。(TabControl.Alignmentプロパティに関係なく縦書きにしていることをご了承ください。)
'フォームの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
//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以前でしか有効でないようです。
TabControl1.Alignment = TabAlignment.Right '縦書きのフォントにする TabControl1.Font = New Font( _ TabControl1.Font.FontFamily, _ TabControl1.Font.Size, _ TabControl1.Font.Style, _ TabControl1.Font.Unit, _ TabControl1.Font.GdiCharSet, _ True)
TabControl1.Alignment = TabAlignment.Right; //縦書きのフォントにする TabControl1.Font = new Font( TabControl1.Font.FontFamily, TabControl1.Font.Size, TabControl1.Font.Style, TabControl1.Font.Unit, TabControl1.Font.GdiCharSet, true);
(この記事は、「.NETプログラミング研究 第51号」で紹介したものを基にしています。)