2009-12-08 102 views
0

我们使用Windows Forms和自定义用户控件,我希望能够以特定形式旋转托管userControl的面板。我已经看到与WPF类似的功能,但暂时不能使用它。是否可以使用可能的内置.NET方法或GDI+来实现面板及其子项的旋转?在Windows窗体中旋转.NET面板

我已经看到一些非常酷的视觉效果,在游戏开发中显示的菜单,所以我想知道是否有可能使用Windows窗体创建类似的效果。

+0

* [C#垂直标签在Windows窗体中]的可能重复(http://stackoverflow.com/questions/1371943/c-sharp-vertical-label-in-a-windows-forms)*。 – 2014-01-16 09:23:02

回答

2

在Windows Forms中旋转一个面板及其子项并不直接支持,我认为它最终会成为一个容易被大量时间占用的麻烦头痛。想想你在WPF中这样做的时候,使用C#代码的零行,并且只有一小部分XAML,这是特别痛苦的。

+0

如何使用WPF旋转面板?请见我的问题http://stackoverflow.com/questions/15499764/rotate-a-panel-90?noredirect=1#comment21945525_15499764 – Ladessa 2013-03-19 13:10:47

2

通过调用Graphics对象上的RotateTransform方法,可以在GDI +中使用旋转。

但是,旋转整个控件并不是那么简单,而且在很大程度上取决于控件的实现方式。
如果它是一个内部具有其他控件的组合用户控件,那么您运气不好。
如果它是自己绘制的单色控件,请尝试继承控件,覆盖OnPaint方法,并在Graphics对象上调用RotateTransform。但是,您可能会遇到麻烦。特别是,您可能需要重写所有的鼠标事件,并使用旋转的坐标调用基本控件的事件。

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上的点击和按键事件,操作面板中的控件,然后更新图像。