System.Windows.Forms.Label クラスを拡張して、縦書きのテキストをサポートしようとしています。これを行うには、ユーザーが Horizontal または Vertical に設定できる MyLabelOrientation という新しいプロパティを作成します。ユーザーがこの設定を変更すると、幅と高さの値が交換され、コントロールが新しい向きにサイズ変更されます。最後に、OnPaint 関数をオーバーライドして Label を描画します。
このコントロールの AutoSize プロパティも拡張して、Label が含まれるテキストに合わせて自動サイズ変更されるようにしたいと考えています。水平方向の場合、基本機能がこれを実装します。垂直方向の場合、Graphics オブジェクトを作成し、コントロールの高さを Graphics.MeasureString(Text, Font) から返される SizeF オブジェクトの幅に設定します。以下に、私が使用しているコードの例を示します。
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel.Design;
using System.Windows.Forms.Design;
public class MyLabel : Label
{
public enum MyLabelOrientation {Horizontal, Vertical};
protected MyLabelOrientation m_orientation = MyLabelOrientation.Horizontal;
[Category("Appearance")]
public virtual MyLabelOrientation Orientation
{
get { return m_orientation; }
set
{
m_orientation = value;
int temp = Height;
Width = Height;
Height = temp;
Refresh();
}
}
private Size ResizeLabel()
{
Graphics g = Graphics.FromHwnd(this.Handle);
SizeF newSize = g.MeasureString(Text, Font);
if (m_orientation == MyLabelOrientation.Horizontal)
Width = (int)newSize.Width;
else
Height = (int)newSize.Width;
}
protected override void OnPaint(PaintEventArgs e)
{
Brush textBrush = new SolidBrush(this.ForeColor);
if (m_orientation == LabelOrientation.Vertical)
{
e.Graphics.TranslateTransform(Width, 0);
e.Graphics.RotateTransform(90);
e.Graphics.DrawString(Text, Font, textBrush, Padding.Left, Padding.Top);
}
else
{
base.OnPaint(e);
}
}
}
ただし、AutoSize を true に設定すると、コントロールのサイズの変更が防止および/またはオーバーライドされるようです。これは、ラベルの向きを変更したいときに幅や高さを変更できないことを意味します。AutoSize が設定されているかどうかをテストし、その向きに応じてコントロールのサイズを調整できるように、この動作をオーバーライドできるかどうか疑問に思っています。