簡體   English   中英

在 Windows 窗體中旋轉 .NET 面板

[英]Rotating a .NET panel in Windows Forms

我們使用Windows 窗體和自定義用戶控件,我希望能夠以特定形式旋轉托管 userControl 的面板。 我已經看到WPF 的類似功能,但我暫時無法使用它。 是否可以使用可能的內置 .NET 方法或GDI+來實現面板及其子項的旋轉?

我在游戲開發中看到了一些非常酷的菜單視覺效果,所以我想知道是否可以使用 Windows 窗體創建類似的效果。

您可以通過調用Graphics對象上的RotateTransform方法在 GDI+ 中使用旋轉。

但是,旋轉整個控件並不是那么簡單,並且很大程度上取決於控件的實現方式。
如果它是一個內部包含其他控件的復合 UserControl,那么您就不走運了。
如果它是一個自行繪制的單一控件,請嘗試繼承該控件,覆蓋OnPaint方法,並在 Graphics 對象上調用RotateTransform 但是,您可能會遇到麻煩。 特別是,您可能需要覆蓋所有鼠標事件並使用旋轉坐標調用基本控件的事件。

在 Windows 窗體中旋轉面板及其子項不是直接支持的,我認為它最終會成為一個容易占用大量時間的問題。 考慮何時可以在WPF 中使用零行 C# 代碼和僅少量XAML執行此操作特別痛苦。

您可以通過在面板上調用 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 上的單擊和鍵事件,操作面板中的控件,然后更新圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM