Controle transparente sobre PictureBox

No meu formulário c # eu tenho um label que exibe uma porcentagem de download no evento de download:

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

A propriedade BackColor do controle Label está definida como transparente e eu quero que ela seja exibida em um PictureBox. Mas isso não parece funcionar corretamente, vejo um fundo cinza, não parece transparente em cima da checkbox de imagem. Como posso consertar isso?

O controle Label suporta bem a transparência. É só que o designer não deixa você colocar a etiqueta corretamente. O controle PictureBox não é um controle de contêiner, portanto, o formulário se torna o pai do label. Então você vê o plano de fundo do formulário.

É fácil corrigir adicionando um pouco de código ao construtor de formulário. Você precisará alterar a propriedade Parent da etiqueta e recalculá-la, pois ela é agora relativa à checkbox de imagem, e não ao formulário. Como isso:

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

Parece que em tempo de execução:

insira a descrição da imagem aqui


Outra abordagem é resolver o problema de tempo de design. Isso só leva um atributo. Adicione uma referência ao System.Design e adicione uma class ao seu projeto, cole este código:

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

Você pode simplesmente usar

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

Você pode desenhar texto usando o TextRenderer que irá desenhar sem fundo:

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

Quando o valor globalpercent for alterado, atualize pictureBox:

 pictureBox1.Refresh(); 

Você também pode usar Graphics.DrawString mas TextRenderer.DrawText (usando GDI) é mais rápido que DrawString (GDI +)

Veja também outra resposta aqui e a referência DrawText aqui

Para fácil para o seu design. Você pode colocar sua etiqueta dentro de um painel. e definir a imagem de fundo do painel é o que cada imagem que você deseja. conjunto label fundo é transparente

Usando o Visual Studio com o Windows Form, você pode aplicar transparência a labels ou outros elementos adicionando usando System.Drawing; em Form1.Designer.cs Desta forma, você terá Transparency disponível no painel Properties (em Appearance at BackColor). Ou apenas edite o código no Designer.cs this.label1.BackColor = System.Drawing.Color.Transparent;