4 Stimmen

Ist es möglich, eine Schaltfläche-Steuerelement in WinForms zu drehen?

Ist es möglich, eine Schaltfläche oder ein beliebiges Steuerelement in einem bestimmten Winkel in WinForms zu drehen? Wenn ja, wie?

10 Stimmen

Bitte werden Sie konkreter. Sie haben Ihr GUI-Toolkit/Framework nicht erwähnt, und Sie haben nicht angegeben, was Sie mit "drehen" meinen (nur um 90°? um einen beliebigen Winkel?)

0 Stimmen

Drehen mit beliebigem Winkel (90, 180,...)

10voto

TaW Punkte 50688

Wenn Sie 熟々 wollen (ich habe keine Ahnung, warum man das tun sollte..*), könnten Sie versuchen, eine Button Unterklasse, vielleicht so:

public partial class TurnButton : Button
{
    public TurnButton()
    {
        InitializeComponent();
    }

    int angle = 0;   // current rotation
    Point oMid;      // original center

    protected override void OnLayout(LayoutEventArgs levent)
    {
        base.OnLayout(levent);
        if (oMid == Point.Empty) oMid = new Point(Left + Width / 2, Top + Height / 2);
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
       int mx = this.Size.Width / 2;
       int my = this.Size.Height / 2;
       SizeF size = pe.Graphics.MeasureString(Text, Font);
       string t_ = Text;
       Text = "";

        base.OnPaint(pe);

        if (!this.DesignMode)
        {
            Text = t_; pe.Graphics.TranslateTransform(mx, my);
            pe.Graphics.RotateTransform(angle);
            pe.Graphics.TranslateTransform(-mx, -my);

            pe.Graphics.DrawString(Text, Font, SystemBrushes.ControlText,
                                  mx - (int)size.Width / 2, my - (int)size.Height / 2);
        }
    }

    protected override void OnClick(EventArgs e)
    {
        this.Size = new Size(Height, Width);
        this.Location = new Point(oMid.X - Width / 2, oMid.Y - Height / 2);
        angle = (angle + 90) % 360;
        Text = angle + "°";

        base.OnClick(e);
    }
}

(* Ich habe auch keine Ahnung, warum ich das geschrieben habe ;-)

2 Stimmen

Ich habe keine Ahnung, warum ich das benutze :)

7voto

Cody Gray Punkte 229889

Sie können die Steuerelemente nicht drehen. Das wird von den nativen API-Steuerelementen, die WinForms verwendet, einfach nicht unterstützt.

Und man könnte sich fragen, warum es überhaupt sollte unterstützt werden. Was könnten Sie möglicherweise versuchen zu tun, dass Sie brauchen, um eine Schaltfläche Steuerung drehen? Es wäre viel einfacher, sie an einer anderen Stelle mit einer anderen Form zu zeichnen, als zu versuchen, ein vorhandenes Steuerelement zu drehen. (Beachten Sie, dass Sie die Größe und Position eines Steuerelements auch während der Laufzeit ändern können, falls dies für Ihre Zwecke erforderlich ist. Untersuchen Sie die Size y Location Eigenschaften).

Die einzige Abhilfe besteht darin, das Bild des Steuerelements in eine Bitmap zu zeichnen, das Steuerelement auszublenden und die Bitmap an der gewünschten Stelle in das Formular zu zeichnen. Das führt natürlich nicht zu einem Steuerelement, das der Benutzer interagieren mit. Sie werden nicht in der Lage sein, auf einen Bild eines Knopfes, weil es kein echter Knopf ist. Wenn das für Sie akzeptabel ist, sollten Sie wahrscheinlich in erster Linie ein Bild und nicht eine Schaltfläche verwenden.

2voto

Michael McMullen Punkte 111

Das ist ähnlich wie die hier gestellte Frage: Drehen eines .NET-Panels in Windows Forms

Die kurze Zusammenfassung der Antworten auf diese Frage ist, dass es zwar möglich ist, aber sehr, sehr kompliziert wäre.

0voto

2pietjuh2 Punkte 891

Ein möglicher Ausweg wäre in manchen Fällen folgender:

Verwenden Sie ein tabControl , und ändern Sie dessen Größe so, dass nur noch die Schaltfläche übrig ist. Setzen Sie die Ausrichtung auf links/rechts, und Sie haben Ihre Schaltfläche um 90/270 Grad gedreht.

-2voto

mohamed hegab Punkte 1
public class VerticalButton : Button
{
    public string VirticalText { get; set; }
    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);

        StringFormat stringFormat = new StringFormat();
        stringFormat.FormatFlags = StringFormatFlags.DirectionVertical;
        SolidBrush solidBrush = new SolidBrush(this.ForeColor);

        stringFormat.Alignment = StringAlignment.Center;
        stringFormat.LineAlignment = StringAlignment.Center;

        pe.Graphics.DrawString(VirticalText, this.Font, solidBrush,
            new Rectangle(0, 0, Width, Height), stringFormat);
    }
}

0 Stimmen

Die Antwort "nur Code" ist veraltet. Sie sollten eine Erklärung hinzufügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X