在Windows窗体中旋转.NET面板
问题描述:
我们使用Windows Forms和自定义用户控件,我希望能够以特定形式旋转托管userControl的面板。我已经看到与WPF类似的功能,但暂时不能使用它。是否可以使用可能的内置.NET方法或GDI+来实现面板及其子项的旋转?在Windows窗体中旋转.NET面板
我已经看到一些非常酷的视觉效果,在游戏开发中显示的菜单,所以我想知道是否有可能使用Windows窗体创建类似的效果。
答
通过调用Graphics
对象上的RotateTransform方法,可以在GDI +中使用旋转。
但是,旋转整个控件并不是那么简单,而且在很大程度上取决于控件的实现方式。
如果它是一个内部具有其他控件的组合用户控件,那么您运气不好。
如果它是自己绘制的单色控件,请尝试继承控件,覆盖OnPaint
方法,并在Graphics对象上调用RotateTransform
。但是,您可能会遇到麻烦。特别是,您可能需要重写所有的鼠标事件,并使用旋转的坐标调用基本控件的事件。
答
通过调用面板上的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上的点击和按键事件,操作面板中的控件,然后更新图像。
* [C#垂直标签在Windows窗体中]的可能重复(http://*.com/questions/1371943/c-sharp-vertical-label-in-a-windows-forms)*。 – 2014-01-16 09:23:02