在WinForm中旋转面板

时间:2010-10-26 21:55:27

标签: c#

如何旋转(90度)面板控件?我知道它在WPF中非常简单,但我无法使用它。 你知道WinForm面板控件的这种方式吗? 谢谢大家!

1 个答案:

答案 0 :(得分:1)

您必须覆盖OnPaint,然后使用GDI手动绘制panel上的所有控件。我从未做过旋转,但是我已经为下拉菜单做了一些自定义重绘。您需要为面板上的每种控件类型编写自定义OnPaints。

更多关于这一点,因为我只是尝试了我自己...我不认为你可以自定义绘制大多数常见控件。 WPF是一种不同的动物,旨在支持这种类型的东西。当这些控件涂漆时,它们会在封面下进行涂漆,而您无法做任何事情。我能够绘制和旋转面板,但我无法像复选框那样执行其他控件。

    public class RotatePanel : Panel, IRotate
    {

        public RotatePanel() : base()
        {
            Angle = 0;
        }


        protected override void OnPaint(PaintEventArgs e)
        {
            using (Graphics g = this.CreateGraphics())
            {
                foreach (IRotate control in this.Controls)
                {
                    control.Angle = Angle;
                }
                g.RotateTransform(Angle);
                g.DrawRectangle(new System.Drawing.Pen(new SolidBrush(Color.Black), 2f), 4f, 4f, 10f, 10f);
                g.DrawRectangle(new System.Drawing.Pen(new SolidBrush(Color.Azure), 2f), 14f, 14f, 30f, 30f);
                g.Flush();
            }
            base.OnPaint(e);
        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
            base.OnPaintBackground(e);
        }

        public float Angle
        {
            get;
            set;
        }
    }

    public interface IRotate
    {
        float Angle { get; set; }
    }

   public class RotateCheckBox : CheckBox, IRotate
    {
        public float Angle { get; set; }
        public RotateCheckBox():base()
        {
            Angle = 0;
        }


        protected override void OnPaint(PaintEventArgs pevent)
        {
            pevent.Graphics.RotateTransform(this.Angle);
            pevent.Graphics.Flush();
            base.OnPaint(pevent);
        }
    }