I'm working on a very image intensive application.
In this example, there is a Panel at the very back with a background image and a PictureBox ontop of that with a background image. When I add a label ontop of that and set the background colour to be transparent, the background colour displayed is of the Panel background image and it completely ignores the image that's in between the two. Am I doing something wrong?
CodePudding user response:
That's how transparency works in Windows Forms. It's fake. A transparent control isn't actually transparent and allowing what's behind it to show through. Instead, it just draws a copy of its parent in its own background. If you want a PictureBox
to show through a Label
then the Label
has to actually be a child of the PictureBox
. The catch is that you cannot do that in the designer, so you have to add the Label
to some other container and then move it to the PictureBox
in code. I suggest that you place the Label
in the exact location you want it in the designer, regardless of its parent container. You can then do this in the Load
event handler of your form:
label1.Location = pictureBox1.PointToClient(label1.PointToScreen(Point.Empty));
label1.Parent = pictureBox1;
That code gets the location of the Label
relative to the screen, then translates that to a Point
relative to the PictureBox
and assigns that to the Location
of the Label
. When the Label
is added to the PictureBox
, it appears at that location, so in the exact same location it was to start with, only inside the PictureBox
.
Here's an extension method that does the same thing:
public static class ControlExtensions
{
public static void SetParentWithSameScreenCoordinates(this Control source, Control parent)
{
source.Location = parent.PointToClient(source.PointToScreen(Point.Empty));
source.Parent = parent;
}
}
You can then do this in your Load
event handler:
label1.SetParentWithSameScreenCoordinates(pictureBox1);