Contrôle transparent sur PictureBox

Dans mon formulaire C #, j’ai une étiquette qui affiche un pourcentage de téléchargement dans l’événement de téléchargement:

this.lblprg.Text = overallpercent.ToSsortingng("#0") + "%"; 

La propriété BackColor du contrôle Label est définie pour être transparente et je souhaite qu’elle s’affiche sur une PictureBox. Mais cela ne semble pas fonctionner correctement, je vois un fond gris, il ne semble pas transparent sur le dessus du bloc d’image. Comment puis-je réparer cela?

Le contrôle Label prend bien en charge la transparence. C’est juste que le concepteur ne vous laissera pas placer l’étiquette correctement. Le contrôle PictureBox n’est pas un contrôle de conteneur afin que le formulaire devienne le parent de l’étiquette. Donc, vous voyez l’arrière-plan du formulaire.

Il est facile à corriger en ajoutant un peu de code au constructeur du formulaire. Vous devez modifier la propriété Parent de l’étiquette et recalculer son emplacement car il est maintenant relatif à la zone d’image au lieu du formulaire. Comme ça:

  public Form1() { InitializeComponent(); var pos = this.PointToScreen(label1.Location); pos = pictureBox1.PointToClient(pos); label1.Parent = pictureBox1; label1.Location = pos; label1.BackColor = Color.Transparent; } 

Cela ressemble à ceci à l’exécution:

entrer la description de l'image ici


Une autre approche consiste à résoudre le problème de conception. Cela prend juste un atsortingbut. Ajoutez une référence à System.Design et ajoutez une classe à votre projet, collez ce code:

 using System.ComponentModel; using System.Windows.Forms; using System.Windows.Forms.Design; // Add reference to System.Design [Designer(typeof(ParentControlDesigner))] class PictureContainer : PictureBox {} 

Vous pouvez simplement utiliser

 label1.Parent = pictureBox1; label1.BackColor = Color.Transparent; // You can also set this in the designer, as stated by ElDoRado1239 

Vous pouvez dessiner du texte en utilisant TextRenderer qui le dessine sans arrière-plan:

 private void pictureBox1_Paint(object sender, PaintEventArgs e) { TextRenderer.DrawText(e.Graphics, overallpercent.ToSsortingng("#0") + "%", this.Font, new Point(10, 10), Color.Red); } 

En cas de modification de la valeur globale, actualisez pictureBox:

 pictureBox1.Refresh(); 

Vous pouvez également utiliser Graphics.DrawSsortingng mais TextRenderer.DrawText (utilisant GDI) est plus rapide que DrawSsortingng (GDI +)

Regardez également une autre réponse ici et la référence DrawText ici

Pour facile pour votre conception. Vous pouvez placer votre étiquette dans un panneau. et définir l’image de fond du panneau est ce que chaque image que vous voulez. définir le fond de l’étiquette est transparent

En utilisant Visual Studio avec Windows Form, vous pouvez appliquer la transparence aux étiquettes ou à d’autres éléments en ajoutant à l’ aide de System.Drawing; dans Form1.Designer.cs De cette façon, vous aurez la transparence disponible dans le panneau Propriétés (dans Apparence chez BackColor). Ou modifiez simplement le code dans Designer.cs this.label1.BackColor = System.Drawing.Color.Transparent;