web-dev-qa-db-fra.com

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.ToString("#0") + "%";

La propriété BackColor du contrôle Label est définie pour être transparente et je souhaite qu'elle soit affichée sur un PictureBox. Mais cela ne semble pas fonctionner correctement, je vois un fond gris, il ne semble pas transparent au-dessus de la zone d'image. Comment puis-je réparer cela?

63
Derezzed

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, le formulaire devient le parent de l'étiquette. Donc, vous voyez le fond du formulaire.

Il est facile d'y remédier en ajoutant un peu de code au constructeur de formulaire. Vous devrez modifier la propriété Parent de l'étiquette et recalculer son emplacement car elle est maintenant relative à 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;
    }

Ressemble à ceci au moment de l'exécution:

enter image description here


Une autre approche consiste à résoudre le problème de la conception. Cela prend juste un attribut. 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 {}
150
Hans Passant

Vous pouvez simplement utiliser

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

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

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

Lorsque la valeur globale change, actualisez pictureBox:

pictureBox1.Refresh();

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

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

9
Maciej

Pour facile pour votre conception. Vous pouvez placer votre étiquette dans un panneau. et définir l’image d’arrière-plan du panneau correspond à chaque image souhaitée. le fond de l'étiquette est transparent

5
Grey Wolf