Winforms 在Windows窗体中旋转.NET面板

Winforms 在Windows窗体中旋转.NET面板,winforms,transformation,graphic-effects,Winforms,Transformation,Graphic Effects,我们使用和自定义用户控件,我希望能够以特定的形式旋转承载用户控件的面板。我已经看到了与的类似功能,但我暂时无法使用它。是否可以使用内置的.NET方法或其他方法实现面板及其子面板的旋转 我在游戏开发中看到了一些非常酷的菜单视觉效果,所以我想知道是否有可能使用Windows窗体创建类似的效果。您可以在GDI+中通过调用图形对象的方法来使用旋转 但是,旋转整个控件并不是那么简单,这在很大程度上取决于控件的实现方式。 如果它是一个包含其他控件的复合用户控件,那么你就倒霉了。 如果是绘制自身的sinlge

我们使用和自定义用户控件,我希望能够以特定的形式旋转承载用户控件的面板。我已经看到了与的类似功能,但我暂时无法使用它。是否可以使用内置的.NET方法或其他方法实现面板及其子面板的旋转


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

您可以在GDI+中通过调用
图形
对象的方法来使用旋转

但是,旋转整个控件并不是那么简单,这在很大程度上取决于控件的实现方式。
如果它是一个包含其他控件的复合用户控件,那么你就倒霉了。

如果是绘制自身的sinlge控件,请尝试继承该控件,重写
OnPaint
方法,并在图形对象上调用
RotateTransform
。但是,您可能会遇到问题。特别是,您可能需要覆盖所有鼠标事件,并使用旋转坐标调用基本控件的事件。

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

但是,旋转整个控件并不是那么简单,这在很大程度上取决于控件的实现方式。
如果它是一个包含其他控件的复合用户控件,那么你就倒霉了。

如果是绘制自身的sinlge控件,请尝试继承该控件,重写
OnPaint
方法,并在图形对象上调用
RotateTransform
。但是,您可能会遇到问题。特别是,您可能需要覆盖所有鼠标事件,并使用旋转坐标调用基本控件的事件。

在Windows窗体中旋转面板及其子控件是不受直接支持的,而且我认为它最终会成为一个令人头痛的问题,很容易占用大量时间。想想什么时候你可以用零行C#代码和一点点C#代码来实现这一点,尤其令人痛苦。

在Windows窗体中旋转面板及其子级不是直接支持的,我认为这最终会成为一个令人头痛的问题,很容易占用很多时间。想想什么时候可以用零行C#代码和一点点C#代码来实现这一点特别痛苦。

你可以在面板上调用DrawToBitmap方法,然后旋转位图并将其显示出来,例如在图片框中:

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

var pictureBox = new PictureBox();

pictureBox.Location = panel.Location;
pictureBox.SizeMode = PictureBoxSizeMode.AutoSize;
pictureBox.Image = bitmap;

Controls.Remove(panel);
Controls.Add(pictureBox);
如果使用GDI将位图绘制到另一个位图中,也可以使用90度增量以外的旋转角度:

var bitmap2  = new Bitmap(bmp.Width + 75, bmp.Height + 100);
var graphics = Graphics.FromImage(bmp2);

graphics.TranslateTransform(bitmap2.Width / 2, bitmap2.Height / 2);
graphics.RotateTransform(-15f);
graphics.TranslateTransform(-bitmap.Width / 2, -bitmap.Height / 2);
graphics.DrawImageUnscaled(bitmap, Point.Empty);
graphics.Dispose();
当然,问题是您只显示面板的图像,而不是面板本身,因此无法再与内部控件交互


这可能也可以做到,但您必须处理窗口消息,这会变得更加复杂。根据您的需要,您还可以处理PictureBox上的单击和按键事件,操作面板中的控件,然后更新图像。

您可以在面板上调用DrawToBitmap方法,然后旋转位图并将其显示在PictureBox中,以达到一半的效果:

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

var pictureBox = new PictureBox();

pictureBox.Location = panel.Location;
pictureBox.SizeMode = PictureBoxSizeMode.AutoSize;
pictureBox.Image = bitmap;

Controls.Remove(panel);
Controls.Add(pictureBox);
如果使用GDI将位图绘制到另一个位图中,也可以使用90度增量以外的旋转角度:

var bitmap2  = new Bitmap(bmp.Width + 75, bmp.Height + 100);
var graphics = Graphics.FromImage(bmp2);

graphics.TranslateTransform(bitmap2.Width / 2, bitmap2.Height / 2);
graphics.RotateTransform(-15f);
graphics.TranslateTransform(-bitmap.Width / 2, -bitmap.Height / 2);
graphics.DrawImageUnscaled(bitmap, Point.Empty);
graphics.Dispose();
当然,问题是您只显示面板的图像,而不是面板本身,因此无法再与内部控件交互


这可能也可以做到,但您必须处理窗口消息,这会变得更加复杂。根据您的需要,您还可以处理PictureBox上的单击和按键事件,操作面板中的控件,然后更新图像。

如何使用WPF旋转面板?请看我的问题,我如何用WPF旋转面板?请看我的问题可能的副本。可能的副本。