Rendre les zones d’image transparentes, superposées les unes aux autres?

TL; DR: Regardez l’image ci-dessous

Donc, j’essaie de faire une petite image, et les gens autour de moi et moi sums un peu à court d’idées.

J’ai une table (la position assise et une autre) au milieu (vue d’en haut) et des personnes assises autour d’elle. Ces personnes sont rondes, comme à la table.

Chaque personne a sa propre boîte à images, je n’utilise qu’une image, la fais pivoter et la configure en tant qu’image dans la zone suivante.

Le problème est maintenant le suivant: Les PictureBoxes de personnes situées dans les coins chevauchent le tableau avec des coins vides; dans l’image, la transparence y est présente. Le tableau ci-dessous devrait apparaître, mais à la place, il montre l’arrière-plan du formulaire 🙁

Éditer: Tous les arrière-plans sont définis sur transparent, le formulaire est composé de la bille comme arrière-plan et du blanc (“Fenêtre”) comme couleur d’arrière-plan.

J’ai mis une personne à l’arrière et une à l’avant, il est donc facile de voir:

Voici ce qui se passe

Edit 2 (idem ocmment):

Au cours des deux derniers jours, j’ai lu cette question environ 10 fois, et aucune de celles qui décrivaient exactement ce problème n’a eu de réponse réelle. En essayant de pousser l’un de ceux-ci, on m’a dit que je devrais poser une nouvelle question.

Exemple: Comment rendre picturebox transparent?

La transparence dans Winforms est un peu trompeuse, car ce n’est pas vraiment de la transparence.
Les contrôles Winforms imitent la transparence en décrivant la partie du contrôle parent qu’ils cachent au lieu de leur propre arrière-plan.
Cependant, ils ne peindront pas les autres contrôles qui pourraient être partiellement couverts par eux.
C’est la raison pour laquelle la plupart des blocs d’image supérieurs cachent votre grand bloc d’image.

Vous pouvez résoudre ce problème en créant un contrôle personnalisé qui hérite de PictureBox et remplace sa méthode OnPaintBackground (prise avec de légers ajustements dans cet article de projet de code ):

 protected override void OnPaintBackground(PaintEventArgs e) { base.OnPaintBackground(e); Graphics g = e.Graphics; if (this.Parent != null) { var index = Parent.Controls.GetChildIndex(this); for (var i = Parent.Controls.Count - 1; i > index; i--) { var c = Parent.Controls[i]; if (c.Bounds.IntersectsWith(Bounds) && c.Visible) { using (var bmp = new Bitmap(c.Width, c.Height, g)) { c.DrawToBitmap(bmp, c.ClientRectangle); g.TranslateTransform(c.Left - Left, c.Top - Top); g.DrawImageUnscaled(bmp, Point.Empty); g.TranslateTransform(Left - c.Left, Top - c.Top); } } } } } 

Microsoft a publié un article de la base de connaissances pour résoudre ce problème il y a longtemps, mais il est un peu obsolète et son exemple de code est en VB.Net.

Une autre option consiste à peindre les images vous-même, sans zones de texte pour les conserver, à l’aide de la méthode Graphics.DrawImage .
Le meilleur endroit pour le faire est probablement dans la méthode OnPaint du formulaire.