在WinForms中将标签背景颜色设置为透明会使其忽略下面的任何图像,而显示表单背景图像



我正在开发一个图像密集型应用程序。

在这个例子中,在最后面有一个带有背景图像的Panel,在它的上面有一个带背景图像的PictureBox。当我在上面添加标签并将背景色设置为透明时,显示的背景色是面板背景图像,它完全忽略了介于两者之间的图像。我做错什么了吗?

这就是透明在Windows窗体中的工作方式。这是假的。透明控件实际上并不是透明的,并允许其背后的内容显示出来。相反,它只是在自己的背景中绘制其父对象的副本。如果您希望PictureBox通过Label显示,那么Label实际上必须是PictureBox的子级。问题是在设计器中无法做到这一点,因此必须将Label添加到其他容器中,然后在代码中将其移动到PictureBox中。我建议您将Label放置在设计器中所需的确切位置,而不管它的父容器是什么。然后,您可以在表单的Load事件处理程序中执行此操作:

label1.Location = pictureBox1.PointToClient(label1.PointToScreen(Point.Empty));
label1.Parent = pictureBox1;

该代码获取Label相对于屏幕的位置,然后将其转换为相对于PictureBoxPoint,并将其分配给LabelLocation。当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);

相关内容

  • 没有找到相关文章

最新更新