2009-12-08 5 views
0

Nous utilisons Windows Forms et les contrôles utilisateur personnalisés, et j'aimerais pouvoir faire pivoter le panneau hébergeant l'userControl sous une forme particulière. J'ai vu des fonctionnalités similaires avec WPF, mais je ne peux pas l'utiliser pour le moment. Est-il possible de réaliser la rotation d'un panneau et de ses enfants en utilisant éventuellement des méthodes .NET ou GDI+?Rotation d'un panneau .NET dans Windows Forms

J'ai vu un effet visuel assez cool avec des menus qui sont affichés dans le développement du jeu, donc je me demandais s'il serait possible de créer des effets similaires en utilisant Windows Forms.

+0

Copie possible de * [étiquette verticale C# dans un Windows Forms] (http://stackoverflow.com/questions/1371943/c-sharp-vertical-label-in-a-windows-forms) *. –

Répondre

2

Faire pivoter un panneau et ses enfants dans Windows Forms n'est pas quelque chose de directement pris en charge, et je pense qu'il finira par être un mal de tête buggy qui pourrait facilement absorber beaucoup de temps. Il est particulièrement pénible de penser à quand vous pouvez le faire en WPF avec zéro lignes de code C# et seulement un tout petit peu de XAML.

+0

Comment puis-je faire pivoter le panneau avec WPF? pls, voir ma question http://stackoverflow.com/questions/15499764/rotate-a-panel-90?noredirect=1#comment21945525_15499764 – Ladessa

2

Vous pouvez utiliser des rotations dans GDI + en appelant la méthode RotateTransform sur un objet Graphics. Toutefois, la rotation d'un contrôle entier n'est pas si simple et dépendra fortement de la façon dont le contrôle est implémenté.
S'il s'agit d'un UserControl composite qui possède d'autres contrôles à l'intérieur, vous n'avez pas de chance.
Si c'est un contrôle sinlge qui se peint, essayez d'hériter du contrôle, en remplaçant la méthode OnPaint et en appelant RotateTransform sur l'objet Graphics. Cependant, vous aurez probablement des problèmes avec cela. En particulier, vous devrez probablement remplacer tous les événements de la souris et appeler les événements du contrôle de base avec des coordonnées pivotées.

1

Vous pouvez obtenir à mi-chemin en appelant la méthode DrawToBitmap sur votre panneau, puis en faisant pivoter le bitmap et en l'affichant, par exemple. dans un 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); 

Rotation des angles autres que des incréments de 90 degrés sont également possibles, si vous dessinez le bitmap dans un autre bitmap en utilisant 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(); 

Le problème est bien sûr que vous êtes n'affiche qu'une image de votre panneau, et non le panneau lui-même, il n'est donc plus possible d'interagir avec les contrôles à l'intérieur. Cela pourrait probablement être fait aussi bien, mais vous devriez jouer avec les messages de fenêtre, ce qui devient un peu plus compliqué. En fonction de vos besoins, vous pouvez également vous en sortir en manipulant les événements click et key sur le PictureBox, en manipulant les contrôles du panneau, puis en mettant à jour l'image.

Questions connexes