Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I rotate a label in C#? [duplicate]

Tags:

c#

text

winforms

I want to show a label rotated 90 degrees (so I can put a bunch of them at the top of a table as the headings). Is there an easy way to do this?

like image 987
Andrew Ducker Avatar asked Jan 06 '09 15:01

Andrew Ducker


2 Answers

You will need to write your own or use a custom control.

A The Code Project article you can start with is Customized Text - Orientated Controls in C# - Part I (Label Control). This contains extra functionality, so you should be able to trim it down if you'd like.

And here is some code from it that is of interest:

/// <summary>
/// This is a lable, in which you can set the text in any direction/angle
/// </summary>

#region Orientation

//Orientation of the text

public enum Orientation
{
    Circle,
    Arc,
    Rotate
}

public enum Direction
{
    Clockwise,
    AntiClockwise
}

#endregion

public class OrientedTextLabel : System.Windows.Forms.Label
{
    #region Variables

    private double rotationAngle;
    private string text;
    private Orientation textOrientation;
    private Direction textDirection;

    #endregion

    #region Constructor

    public OrientedTextLabel()
    {
        //Setting the initial condition.
        rotationAngle = 0d;
        textOrientation = Orientation.Rotate;
        this.Size = new Size(105,12);
    }

    #endregion

    #region Properties

    [Description("Rotation Angle"),Category("Appearance")]
    public double RotationAngle
    {
        get
        {
            return rotationAngle;
        }
        set
        {
            rotationAngle = value;
            this.Invalidate();
        }
    }

    [Description("Kind of Text Orientation"),Category("Appearance")]
    public Orientation TextOrientation
    {
        get
        {
            return textOrientation;
        }
        set
        {
            textOrientation = value;
            this.Invalidate();
        }
    }

    [Description("Direction of the Text"),Category("Appearance")]
    public Direction TextDirection
    {
        get
        {
            return textDirection;
        }
        set
        {
            textDirection = value;
            this.Invalidate();
        }
    }

    [Description("Display Text"),Category("Appearance")]
    public override string Text
    {
        get
        {
            return text;
        }
        set
        {
            text = value;
            this.Invalidate();
        }
    }

    #endregion

    #region Method

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics graphics = e.Graphics;

        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Center;
        stringFormat.Trimming = StringTrimming.None;

        Brush textBrush = new SolidBrush(this.ForeColor);

        //Getting the width and height of the text, which we are going to write
        float width = graphics.MeasureString(text,this.Font).Width;
        float height = graphics.MeasureString(text,this.Font).Height;

        //The radius is set to 0.9 of the width or height, b'cos not to
        //hide and part of the text at any stage
        float radius = 0f;
        if (ClientRectangle.Width<ClientRectangle.Height)
        {
            radius = ClientRectangle.Width *0.9f/2;
        }
        else
        {
            radius = ClientRectangle.Height *0.9f/2;
        }

        //Setting the text according to the selection
        switch (textOrientation)
        {
            case Orientation.Arc:
            {
                //Arc angle must be get from the length of the text.
                float arcAngle = (2*width/radius)/text.Length;
                if(textDirection == Direction.Clockwise)
                {
                    for (int i=0; i<text.Length; i++)
                    {
                        graphics.TranslateTransform(
                            (float)(radius*(1 - Math.Cos(arcAngle*i + rotationAngle/180 * Math.PI))),
                            (float)(radius*(1 - Math.Sin(arcAngle*i + rotationAngle/180*Math.PI))));
                        graphics.RotateTransform((-90 + (float)rotationAngle + 180*arcAngle*i/(float)Math.PI));
                        graphics.DrawString(text[i].ToString(), this.Font, textBrush, 0, 0);
                        graphics.ResetTransform();
                    }
                }
                else
                {
                    for (int i=0; i<text.Length; i++)
                    {
                        graphics.TranslateTransform(
                            (float)(radius*(1 - Math.Cos(arcAngle*i + rotationAngle/180*Math.PI))),
                            (float)(radius*(1 + Math.Sin(arcAngle*i + rotationAngle/180*Math.PI))));
                        graphics.RotateTransform((-90 - (float)rotationAngle - 180*arcAngle*i/(float)Math.PI));
                        graphics.DrawString(text[i].ToString(), this.Font, textBrush, 0, 0);
                        graphics.ResetTransform();
                    }
                }
                break;
            }
            case Orientation.Circle:
            {
                if (textDirection == Direction.Clockwise)
                {
                    for(int i=0;i<text.Length;i++)
                    {
                        graphics.TranslateTransform(
                            (float)(radius*(1 - Math.Cos((2*Math.PI/text.Length)*i + rotationAngle/180*Math.PI))),
                            (float)(radius*(1 - Math.Sin((2*Math.PI/text.Length)*i + rotationAngle/180*Math.PI))));
                        graphics.RotateTransform(-90 + (float)rotationAngle + (360/text.Length)*i);
                        graphics.DrawString(text[i].ToString(), this.Font, textBrush, 0, 0);
                        graphics.ResetTransform();
                    }
                }
                else
                {
                    for(int i=0;i<text.Length;i++)
                    {
                        graphics.TranslateTransform(
                            (float)(radius*(1 - Math.Cos((2*Math.PI/text.Length)*i + rotationAngle/180*Math.PI))),
                            (float)(radius*(1 + Math.Sin((2*Math.PI/text.Length)*i + rotationAngle/180*Math.PI))));
                        graphics.RotateTransform(-90 - (float)rotationAngle - (360/text.Length)*i);
                        graphics.DrawString(text[i].ToString(), this.Font, textBrush, 0, 0);
                        graphics.ResetTransform();
                    }

                }
                break;
            }

            case Orientation.Rotate:
            {
                //For rotation, who about rotation?
                double angle = (rotationAngle/180)*Math.PI;
                graphics.TranslateTransform(
                    (ClientRectangle.Width+(float)(height*Math.Sin(angle))-(float)(width*Math.Cos(angle)))/2,
                    (ClientRectangle.Height-(float)(height*Math.Cos(angle))-(float)(width*Math.Sin(angle)))/2);
                graphics.RotateTransform((float)rotationAngle);
                graphics.DrawString(text,this.Font,textBrush,0,0);
                graphics.ResetTransform();

                break;
            }
        }
    }
    #endregion
}
like image 180
Bob Avatar answered Oct 22 '22 14:10

Bob


You can also take a look at the Windows ToolStrip control. It has an option for TextDirection that can be set to Vertical90 or Vertical270 and this will rotate your Label text in the appropriate direction.

  • Overview: ToolStrip Class (MSDN)

  • Setting the property (docs.microsoft.com)

  • Enumerated Values (docs.microsoft.com)

like image 27
Joshua Drake Avatar answered Oct 22 '22 14:10

Joshua Drake