2009-12-08 81 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上的點擊和按鍵事件,操作面板中的控件,然後更新圖像。