web-dev-qa-db-ger.com

Vertikale C # -Label in Windows Forms

Kann eine Beschriftung in einem Windows Forms vertikal angezeigt werden?

25
Toto

Beschriftungen sind einfach. Sie müssen lediglich das Ereignis Paint überschreiben und den Text vertikal zeichnen. Beachten Sie, dass GDI für das horizontale Zeichnen von Text optimiert ist. Wenn Sie Text drehen (auch wenn Sie um ein Vielfaches von 90 Grad gedreht werden), sieht es deutlich schlechter aus.

Vielleicht ist es am besten, wenn Sie Ihren Text auf eine Bitmap zeichnen (oder ein Etikett dazu bekommen, sich selbst zu zeichnen), und dann die Bitmap gedreht anzeigen.

Einige C # -Codes zum Zeichnen eines benutzerdefinierten Steuerelements mit vertikalem Text. Beachten Sie, dass ClearType-Text NIEMALS funktioniert, wenn der Text nicht horizontal ist:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;


public partial class VerticalLabel : UserControl
{
    public VerticalLabel()
    {
        InitializeComponent();
    }

    private void VerticalLabel_SizeChanged(object sender, EventArgs e)
    {
        GenerateTexture();
    }

    private void GenerateTexture()
    {
        StringFormat format = new StringFormat();
        format.Alignment = StringAlignment.Center;
        format.LineAlignment = StringAlignment.Center;
        format.Trimming = StringTrimming.EllipsisCharacter;

        Bitmap img = new Bitmap(this.Height, this.Width);
        Graphics G = Graphics.FromImage(img);

        G.Clear(this.BackColor);

        SolidBrush brush_text = new SolidBrush(this.ForeColor);
        G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
        G.DrawString(this.Name, this.Font, brush_text, new Rectangle(0, 0, img.Width, img.Height), format);
        brush_text.Dispose();

        img.RotateFlip(RotateFlipType.Rotate270FlipNone);

        this.BackgroundImage = img;
    }
}
20
David Rutten

Erstellen Sie eine Klasse myLabel, die ihren Text in jedem von Ihnen angegebenen Winkel drehen kann.

Sie können es per Code oder durch einfaches Ziehen aus der ToolBox verwenden 

using System.Drawing;

class myLabel:System.Windows.Forms.Label
{
    public int RotateAngle { get; set; }  // to rotate your text
    public string NewText { get; set; }   // to draw text
    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    {
        Brush b =new SolidBrush(this.ForeColor);           
        e.Graphics.TranslateTransform(this.Width / 2, this.Height / 2);
        e.Graphics.RotateTransform(this.RotateAngle);
        e.Graphics.DrawString(this.NewText, this.Font,b , 0f, 0f);
        base.OnPaint(e);
    }
}

Dieses benutzerdefinierte Steuerelement wird jetzt in Ihrem Formular verwendet. 

Sie müssen unten Eigenschaften festlegen  

 1. mylbl.Text = "";             //which can be changed by NewText property
 2. mylbl.AutoSize = false;      // adjust according to your text
 3. mylbl.NewText = "Hello";     // whatever you want to display
 4. mylbl.ForeColor = Color.Red;  // color to display
 5. mylbl.RotateAngle = -90;     //angle to rotate
16
Javed Akram

Ich habe die Antwort von Javed Akram erweitert, um die Größe des Widgets automatisch zu ändern (ich benötigte diese Funktion). Es funktioniert sowohl für positive als auch für negative Winkel, wie Javed sagt: 

 1. mylbl.Text = "";             // which can be changed by NewText property
 2. mylbl.AutoSize = false;      // adjust according to your text
 3. mylbl.NewText = "Hello";     // whatever you want to display
 4. mylbl.ForeColor = Color.Red; // color to display
 5. mylbl.RotateAngle = -90;     // angle to rotate

Hier ist der Code:

public class RotatingLabel : System.Windows.Forms.Label
{
    private int m_RotateAngle = 0;
    private string m_NewText = string.Empty;

    public int RotateAngle { get { return m_RotateAngle; } set { m_RotateAngle = value; Invalidate(); } }
    public string NewText { get { return m_NewText; } set { m_NewText = value; Invalidate(); } }

    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    {
        Func<double, double> DegToRad = (angle) => Math.PI * angle / 180.0;

        Brush b = new SolidBrush(this.ForeColor);
        SizeF size = e.Graphics.MeasureString(this.NewText, this.Font, this.Parent.Width);

        int normalAngle = ((RotateAngle % 360) + 360) % 360;
        double normaleRads = DegToRad(normalAngle);

        int hSinTheta = (int)Math.Ceiling((size.Height * Math.Sin(normaleRads)));
        int wCosTheta = (int)Math.Ceiling((size.Width * Math.Cos(normaleRads)));
        int wSinTheta = (int)Math.Ceiling((size.Width * Math.Sin(normaleRads)));
        int hCosTheta = (int)Math.Ceiling((size.Height * Math.Cos(normaleRads)));

        int rotatedWidth = Math.Abs(hSinTheta) + Math.Abs(wCosTheta);
        int rotatedHeight = Math.Abs(wSinTheta) + Math.Abs(hCosTheta);

        this.Width = rotatedWidth;
        this.Height = rotatedHeight;

        int numQuadrants = 
            (normalAngle >= 0 && normalAngle < 90) ? 1 :
            (normalAngle >= 90 && normalAngle < 180) ? 2 :
            (normalAngle >= 180 && normalAngle < 270) ? 3 :
            (normalAngle >= 270 && normalAngle < 360) ? 4 :
            0;

        int horizShift = 0;
        int vertShift = 0;

        if (numQuadrants == 1)
        {
            horizShift = Math.Abs(hSinTheta);
        }
        else if (numQuadrants == 2)
        {
            horizShift = rotatedWidth;
            vertShift = Math.Abs(hCosTheta);
        }
        else if (numQuadrants == 3)
        {
            horizShift = Math.Abs(wCosTheta);
            vertShift = rotatedHeight;
        }
        else if (numQuadrants == 4)
        {
            vertShift = Math.Abs(wSinTheta);
        }

        e.Graphics.TranslateTransform(horizShift, vertShift);
        e.Graphics.RotateTransform(this.RotateAngle);

        e.Graphics.DrawString(this.NewText, this.Font, b, 0f, 0f);
        base.OnPaint(e);
    }
}
10
Buddy

Ich habe einen Weg gefunden, dies einfach zu tun, ohne Code oder Klassen zu Ihrem Projekt hinzuzufügen!

Wenn Sie Ihr Label erstellen, fügen Sie einfach Folgendes hinzu:

this.label1.text = "V\nE\nR\nT\nI\nC\nA\nL\n";

Das hat für mich funktioniert!

5
Yor

Sie können Text anstelle des Label-Steuerelements in der OnPaint-Ereignis- oder Paint-Methode drehen:

private void uc1_Paint(object sender, PaintEventArgs e)
{
    string Name;
    var g = e.Graphics;
    g.DrawString(Name, new Font("Tahoma", 8), Brushes.Black, 0, 0,
    new StringFormat(StringFormatFlags.DirectionVertical));
}
3
Ali

Update 2015 zu einem alten Beitrag. Da die meisten anderen Antworten den Designer von VS2013 in Bezug auf die Benutzerfreundlichkeit stark beeinträchtigen, würde ich folgende Lösung vorschlagen:

http://www.codeproject.com/Articles/19774/Extended-Vertical-Label-Control-in-C-NET

1
0x25b3

Es funktioniert absolut. Ich habe es im Netz gefunden und wenig verändert

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.ComponentModel;


public class VerticalLabel : System.Windows.Forms.Label
{

    private bool bFlip = true;

    public VerticalLabel()
    {
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics g = e.Graphics;

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

        Brush textBrush = new SolidBrush(this.ForeColor);

        Matrix storedState = g.Transform;

        if (bFlip)
        {
            g.RotateTransform(180f);
            g.TranslateTransform(-ClientRectangle.Width,-ClientRectangle.Height);  
        }
        g.DrawString(
            this.Text,
            this.Font,
            textBrush,
            ClientRectangle,
            stringFormat);

        g.Transform = storedState;
    }

    [Description("When this parameter is true the VLabel flips at 180 degrees."),Category("Appearance")]
    public bool Flip180
    {
        get
        {
            return bFlip;
        }
        set
        {
            bFlip = value;
            this.Invalidate();
        }
    }
}
0

Gebrauchte Stücke von anderen

Jeremy

public partial class VerticalLabel_UserControl : UserControl
{
    private IComponentChangeService _changeService;
    private string strPropertyText = "Vertical Text";

    public VerticalLabel_UserControl()
    {
        InitializeComponent();
    }

    [EditorBrowsable(EditorBrowsableState.Always)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    [Bindable(true)]
    public override string Text { get { return base.Text; } set { base.Text = value; this.Invalidate(); } }

    private void VerticalLabel_UserControl_SizeChanged(object sender, EventArgs e)
    {
        GenerateTexture();
    }

    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
    }


    private void GenerateTexture()
    {
        StringFormat format = new StringFormat();
        format.Alignment = StringAlignment.Center;
        format.LineAlignment = StringAlignment.Center;
       // format.Trimming = StringTrimming.EllipsisCharacter;

        Bitmap img = new Bitmap(this.Height, this.Width);
        Graphics G = Graphics.FromImage(img);

        G.Clear(this.BackColor);

        SolidBrush brush_text = new SolidBrush(this.ForeColor);
        G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
        G.DrawString(this.strPropertyText, this.Font, brush_text, new Rectangle(0, 0, img.Width, img.Height), format);

        img.RotateFlip(RotateFlipType.Rotate270FlipNone);

        this.BackgroundImage = img;

        brush_text.Dispose();
    }

    public override System.ComponentModel.ISite Site
    {
        get
        {
            return base.Site;
        }
        set
        {
            _changeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));
            if (_changeService != null)
                _changeService.ComponentChanged -= new ComponentChangedEventHandler(OnComponentChanged);
            base.Site = value;
            if (!DesignMode)
                return;
            _changeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));
            if (_changeService != null)
                _changeService.ComponentChanged += new ComponentChangedEventHandler(OnComponentChanged);
        }
    }

    private void OnComponentChanged(object sender, ComponentChangedEventArgs ce)
    {
        VerticalLabel_UserControl label = ce.Component as VerticalLabel_UserControl;
        if (label == null || !label.DesignMode)
            return;
        if (((IComponent)ce.Component).Site == null || ce.Member == null || ce.Member.Name != "Text")
            return;

        //Causes the default text to be updated
        string strName = this.Name.ToLower();
        string strText = this.Text.ToLower();
        if (strText.Contains(strName))
        {
            this.Text = "Vertical Text";
        }
        else
        {
            strPropertyText = this.Text;
        }

        //Prints the text vertically
        GenerateTexture();
    }
}
0
Jeremy

Ich habe gerade die AutoSize-Eigenschaft deaktiviert und die Beschriftung vertikal angepasst. Ich habe das Etikett für nur einen Buchstaben breit genug gemacht. Dann habe ich TextAlign in die Mitte geändert, damit die Ausrichtung besser aussieht. Das hat gut für mich funktioniert.

0
JasonD