2012-02-22 15 views
55

En mi C# Forma I tiene una etiqueta que muestra un porcentaje descarga en caso de descarga:de control transparente sobre PictureBox

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

propiedad BackColor del control Label está dispuesto a ser transparente y quiero que se muestre más un PictureBox. Pero eso no parece funcionar correctamente, veo un fondo gris, no se ve transparente en la parte superior del cuadro de imagen. ¿Cómo puedo arreglar esto?

Respuesta

134

El control Label admite transparencias. Es solo que el diseñador no le permitirá colocar la etiqueta correctamente. El control PictureBox no es un control de contenedor, por lo que el formulario se convierte en el elemento primario de la etiqueta. Entonces ves el fondo del formulario.

Es fácil de arreglar agregando un poco de código al constructor de formulario. Tendrá que cambiar la propiedad principal de la etiqueta y volver a calcular su ubicación, ya que ahora está relacionada con el cuadro de imagen en lugar del formulario. De esta manera:

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

tiene este aspecto en tiempo de ejecución:

enter image description here


Otro enfoque es resolver el problema en tiempo de diseño. Eso solo requiere un atributo. Añadir una referencia a System.Design y añadir una clase a su proyecto, pega 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 {} 
+0

Gracias, funciona perfectamente pero el cuadro de imagen es una ProgressBar personalizada y los detalles de la descarga no aparecen hasta que ProgressBar aumenta en la ubicación de la etiqueta, ¿cómo puedo hacerlo visible siempre y no solo cuando ProgressBar lo toca? Aquí una! [Imagen] (http: //i.imm.io/h342.jpeg) – Derezzed

+1

Hice esto, hasta que me di cuenta de que no necesitaba una imagen. El control Label tiene una propiedad de imagen que podría ser suficiente si los escenarios simples no requieren formato de imagen. – Larry

+1

Esto funciona solo si tiene un cuadro de imagen antes de la etiqueta y no varias ... – alap

9

Puede dibujar texto usando TextRenderer que atraerá sin fondo:

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

Cuando, cambia el valor overallpercent refrescar Picturebox:

pictureBox1.Refresh(); 

También puede utilizar Graphics.DrawString pero TextRenderer.DrawText (utilizando GDI) es más rápido que DrawString (GDI +)

También consulte otra respuesta here y DrawText referencia here

+0

Gracias! Esta fue la única solución que ayudó a poner un texto (fondo transparente) en una ProgressBar. – Prokurors

32

sólo puede utilizar

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

¡Eso es perfecto !, nunca se usó la propiedad principal de la etiqueta. Bien hecho. :) – Bravo

+0

Para mí, "Color.Transparent" aparece como desconocido y "System.Drawing.Color.Transparent" falla después de ejecutar ... – kokbira

+0

Gracias por confirmar mi sentimiento, la respuesta aceptada es innecesariamente larga. Además, puede establecer BackColor transparente en el diseñador, sin necesidad de escribirlo tampoco. – ElDoRado1239

4

Para una fácil para su diseño. Puede colocar su etiqueta dentro de un panel. y establecer la imagen de fondo del panel es lo que cada imagen que desea. establecer fondo de etiqueta es transparente

+1

Esta solución no funcionará si la imagen es un gif animado. La animación no funcionará como fondo de un panel. – ChunLin

-2

Usando Visual Studio con Windows Form puede aplicar transparencia a etiquetas u otros elementos agregando usando System.Drawing; en Form1.Designer.cs De esta manera tendrá Transparencia disponible desde el panel Propiedades (en Apariencia en BackColor). O simplemente edite el código en Designer.cs this.label1.BackColor = System.Drawing.Color.Transparent;

Cuestiones relacionadas