Controllo trasparente su PictureBox

Nel mio modulo C # ho un’etichetta che mostra una percentuale di download nell’evento di download:

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

La proprietà BackColor del controllo Label è impostata per essere trasparente e voglio che venga visualizzata su un PictureBox. Ma non sembra funzionare correttamente, vedo uno sfondo grigio, non sembra trasparente sulla parte superiore della finestra. Come posso risolvere questo?

Il controllo Label supporta bene la trasparenza. È solo che il progettista non ti consente di posizionare correttamente l’etichetta. Il controllo PictureBox non è un controllo contenitore, quindi il modulo diventa il padre dell’etichetta. Quindi vedi lo sfondo del modulo.

È facile da risolvere aggiungendo un po ‘di codice al costruttore di moduli. È necessario modificare la proprietà Parent dell’etichetta e ricalcolare la sua posizione poiché ora è relativa alla casella immagine anziché al modulo. Come questo:

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

Sembra questo in fase di esecuzione:

inserisci la descrizione dell'immagine qui


Un altro approccio è risolvere il problema in fase di progettazione. Questo richiede solo un attributo. Aggiungi un riferimento a System.Design e aggiungi una class al tuo progetto, incolla questo codice:

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

Puoi semplicemente usare

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

Puoi disegnare il testo usando TextRenderer che lo disegna senza sfondo:

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

Quando il valore del valore totale cambia, aggiornare pictureBox:

 pictureBox1.Refresh(); 

È inoltre ansible utilizzare Graphics.DrawString ma TextRenderer.DrawText (utilizzando GDI) è più veloce di DrawString (GDI +)

Guarda anche un’altra risposta qui e il riferimento DrawText qui

Per facile per il tuo design. È ansible posizionare l’etichetta all’interno di un pannello. e impostare l’immagine di sfondo del pannello è ciò che ogni immagine desiderata. impostare lo sfondo dell’etichetta è trasparente

Utilizzando Visual Studio con Windows Form è ansible applicare la trasparenza alle etichette o ad altri elementi aggiungendo utilizzando System.Drawing; in Form1.Designer.cs In questo modo sarà disponibile la trasparenza dal pannello Proprietà (in Aspetto su BackColor). Oppure modifica il codice in Designer.cs this.label1.BackColor = System.Drawing.Color.Transparent;