0

Windows フォームとカスタム ユーザー コントロールを使用しており、特定のフォームで userControl をホストするパネルを回転できるようにしたいと考えています。WPFで同様の機能を見たことがありますが、今のところ使用できません。おそらく組み込みの .NET メソッドまたはGDI+を使用して、パネルとその子の回転を実現することは可能ですか?

ゲーム開発で表示されるメニューでかなりクールな視覚効果を見たので、Windows フォームを使用して同様の効果を作成できるかどうか疑問に思っていました。

4

3 に答える 3

2

オブジェクトでRotateTransformメソッドを呼び出すことにより、GDI+ で回転を使用できGraphicsます。

ただし、コントロール全体を回転させることはそれほど単純ではなく、コントロールの実装方法に大きく依存します。
内部に他のコントロールがある複合 UserControl である場合は、運が悪いです。
それ自体を描画する単一のコントロールの場合は、コントロールを継承し、メソッドをオーバーライドして、Graphics オブジェクトOnPaintを呼び出してみてください。RotateTransformただし、おそらく問題が発生するでしょう。特に、おそらくすべてのマウス イベントをオーバーライドし、回転した座標でベース コントロールのイベントを呼び出す必要があります。

于 2009-12-08T02:19:28.147 に答える
2

Windows フォームでパネルとその子を回転させることは、直接サポートされているものではなく、多くの時間を簡単に吸い取ってしまうバグだらけの頭痛の種になると思います。これをWPFでゼロ行の C# コードとごくわずかなXAMLだけで実行できる場合を考えるのは特に苦痛です。

于 2009-12-08T03:04:42.287 に答える
1

パネルで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でクリックイベントとキーイベントを処理し、パネルのコントロールを操作してから、画像を更新することもできます。

于 2009-12-08T03:42:36.460 に答える