我正在开发一个图像密集型应用程序。
在这个例子中,在最后面有一个带有背景图像的Panel,在它的上面有一个带背景图像的PictureBox。当我在上面添加标签并将背景色设置为透明时,显示的背景色是面板背景图像,它完全忽略了介于两者之间的图像。我做错什么了吗?
这就是透明在Windows窗体中的工作方式。这是假的。透明控件实际上并不是透明的,并允许其背后的内容显示出来。相反,它只是在自己的背景中绘制其父对象的副本。如果您希望PictureBox
通过Label
显示,那么Label
实际上必须是PictureBox
的子级。问题是在设计器中无法做到这一点,因此必须将Label
添加到其他容器中,然后在代码中将其移动到PictureBox
中。我建议您将Label
放置在设计器中所需的确切位置,而不管它的父容器是什么。然后,您可以在表单的Load
事件处理程序中执行此操作:
label1.Location = pictureBox1.PointToClient(label1.PointToScreen(Point.Empty));
label1.Parent = pictureBox1;
该代码获取Label
相对于屏幕的位置,然后将其转换为相对于PictureBox
的Point
,并将其分配给Label
的Location
。当Label
被添加到PictureBox
时,它出现在该位置,因此在与它开始时完全相同的位置,仅在PictureBox
内部。
这里有一个做同样事情的扩展方法:
public static class ControlExtensions
{
public static void SetParentWithSameScreenCoordinates(this Control source, Control parent)
{
source.Location = parent.PointToClient(source.PointToScreen(Point.Empty));
source.Parent = parent;
}
}
然后,您可以在Load
事件处理程序中执行此操作:
label1.SetParentWithSameScreenCoordinates(pictureBox1);