我們使用Windows Forms和自定義用戶控件,我希望能夠以特定形式旋轉託管userControl的面板。我已經看到與WPF類似的功能,但暫時不能使用它。是否可以使用可能的內置.NET方法或GDI+來實現面板及其子項的旋轉?在Windows窗體中旋轉.NET面板
我已經看到一些非常酷的視覺效果,在遊戲開發中顯示的菜單,所以我想知道是否有可能使用Windows窗體創建類似的效果。
我們使用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://stackoverflow.com/questions/1371943/c-sharp-vertical-label-in-a-windows-forms)*。 – 2014-01-16 09:23:02