2009-12-08 2 views
0

Мы используем Windows Forms и пользовательские элементы управления, и я хотел бы, чтобы у меня была возможность повернуть панель, на которой размещен userControl в определенной форме. Я видел аналогичные функции с WPF, но я не могу использовать его на данный момент. Можно ли добиться вращения панели и ее дочерних элементов, используя, возможно, встроенные методы .NET или GDI+?Вращение панели .NET в Windows Forms

Я видел довольно приятный визуальный эффект с меню, которое отображается в разработке игр, поэтому мне было интересно, можно ли создавать подобные эффекты с помощью Windows Forms.

+0

Возможный дубликат * [Вертикальная метка C# в Windows Forms] (http://stackoverflow.com/questions/1371943/c-sharp-vertical-label-in-a-windows-forms) *. –

ответ

2

Вращение панели и ее детей в Windows Forms не поддерживается напрямую, и я думаю, что в конечном итоге это будет глючная головная боль, которая может легко всасывать много времени. Особенно больно думать о том, когда вы можете сделать это в WPF с нулевыми строками кода C# и всего лишь маленьким битом XAML.

+0

Как я могу повернуть панель с помощью WPF? PLS, см. мой вопрос http://stackoverflow.com/questions/15499764/rotate-a-panel-90?noredirect=1#comment21945525_15499764 – Ladessa

2

Вы можете использовать вращения в GDI +, вызвав метод RotateTransform на объекте Graphics.

Однако поворот всего элемента управления не так прост и будет сильно зависеть от того, как осуществляется управление.
Если это составной UserControl, который имеет другие элементы управления внутри него, вам не повезло.
Если это элемент управления sinlge, который красит себя, попробуйте наследовать элемент управления, переопределяя метод OnPaint и вызывающий RotateTransform на объекте Graphics. Однако у вас, вероятно, возникнут проблемы с этим. В частности, вам, вероятно, придется переопределить все события мыши и вызвать события базового управления с повернутыми координатами.

1

Вы можете добраться на полпути, вызвав метод DrawToBitmap на вашей панели, затем повернув растровое изображение и отобразив его, например. в PictureBox:

Bitmap bmp = new Bitmap(panel.Width, panel.Height); 
panel.DrawToBitmap(bmp, new Rectangle(Point.Empty, panel.Size)); 
bmp.RotateFlip(RotateFlipType.Rotate270FlipNone); 

PictureBox pbox = new PictureBox(); 
pbox.Location = panel.Location; 
pbox.SizeMode = PictureBoxSizeMode.AutoSize; 
pbox.Image = bmp; 
Controls.Remove(panel); 
Controls.Add(pbox); 

углов поворота кроме приращения 90 градусов также возможны, если вы рисуете растрового изображения в другое растровое изображение с помощью GDI:

Bitmap bmp2 = new Bitmap(bmp.Width + 75, bmp.Height + 100); 
Graphics g = Graphics.FromImage(bmp2); 
g.TranslateTransform(bmp2.Width/2, bmp2.Height/2); 
g.RotateTransform(-15f); 
g.TranslateTransform(-bmp.Width/2, -bmp.Height/2); 
g.DrawImageUnscaled(bmp, Point.Empty); 
g.Dispose(); 

Проблема, конечно, в том, что вы только отображение изображения вашей панели, а не самой панели, поэтому больше не возможно взаимодействовать с элементами управления внутри. Возможно, это тоже можно было бы сделать, но вам придется столкнуться с сообщениями в окне, что становится довольно сложным. В зависимости от ваших потребностей вы также можете уйти с обработкой событий щелчка и клавиш на PictureBox, манипулирования элементами управления на панели и последующим обновлением изображения.

Смежные вопросы