0

System.Windows.Forms.Label クラスを拡張して、縦書きのテキストをサポートしようとしています。これを行うには、ユーザーが Horizo​​ntal または 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 が設定されているかどうかをテストし、その向きに応じてコントロールのサイズを調整できるように、この動作をオーバーライドできるかどうか疑問に思っています。

4

3 に答える 3

1

これまでにこれを行ったことはありません。理論的にはプロパティ宣言を(newキーワードを介して)オーバーライドし、続行する前に向きを確認できると思います。

override public bool AutoSize
{
   set 
   {
      if( /* orientation is horizontal */ )
      {
          base.AutoSize = value;
      }
      else
      {
          // do what you need to do
      }    
   }    
}
于 2010-12-14T22:22:21.463 に答える
0

解決策がそれ自体をオーバーライドすることだと思う場合OnResize

protected override void OnResize(EventArgs e)
{
    if (AutoSize)
    {
        // Perform your own resizing logic
    }
    else
        OnResize(e);
}
于 2013-02-06T08:25:03.477 に答える