Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Transparent control over PictureBox

In my C# Form I have a Label that displays a download percentage in the download event:

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

The Label control's BackColor property is set to be transparent and I want it to be displayed over a PictureBox. But that doesn't appear to work correctly, I see a gray background, it doesn't look transparent on top of the picture box. How can I fix this?

like image 412
Derezzed Avatar asked Feb 22 '12 00:02

Derezzed


1 Answers

The Label control supports transparency well. It is just that the designer won't let you place the label correctly. The PictureBox control is not a container control so the Form becomes the parent of the label. So you see the form's background.

It is easy to fix by adding a bit of code to the form constructor. You'll need to change the label's Parent property and recalculate it's Location since it is now relative to the picture box instead of the form. Like this:

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

Looks like this at runtime:

enter image description here


Another approach is to solve the design-time problem. That just takes an attribute. Add a reference to System.Design and add a class to your project, paste this code:

using System.ComponentModel; using System.Windows.Forms; using System.Windows.Forms.Design;    // Add reference to System.Design  [Designer(typeof(ParentControlDesigner))] class PictureContainer : PictureBox {} 
like image 58
Hans Passant Avatar answered Oct 25 '22 14:10

Hans Passant