2010-10-26 2 views
0

Как я могу поворачивать (90 градусов) панель управления? Я знаю, что это очень просто в WPF, но я не могу его использовать. Знаете ли вы, что такое панель управления WinForm? Спасибо всем!Поверните панель в WinForm

+0

Просто из любопытства, почему вы не можете использовать WPF? Вы знаете об ElementHost, да? Мне интересно, потому что мы думаем о добавлении некоторых WPF в наше приложение WinForms, и мне интересно, почему вы не в состоянии. –

ответ

1

Вам необходимо переопределить OnPaint, а затем вручную нарисовать все элементы управления на panel с использованием GDI. Я никогда не делал поворота, но я сделал некоторые пользовательские ретрансляции для таких вещей, как выпадающие списки. Вам нужно будет написать пользовательские 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); 
     } 
    } 
Смежные вопросы