对 PictureBox 的透明控制

在我的 C # 表单中,我有一个在下载事件中显示下载百分比的 Label:

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

Label 控件的 BackColor 属性设置为透明,我希望它显示在 PictureBox 上。但是这看起来不正常,我看到一个灰色的背景,它看起来不透明的图片框顶部。我该怎么补救?

147194 次浏览

你可以使用 TextRenderer 绘制文本,它不需要背景:

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

当总体百分比值发生变化时,刷新 pictureBox:

pictureBox1.Refresh();

也可以使用 Graphics.DrawString 但是 TextRenderer.DrawText (使用 GDI)比 DrawString (GDI +)更快

还可以查看另一个答案 给你和 DrawText 参考 给你

Label 控件很好地支持透明性。只是设计师不让你正确地放置标签。PictureBox 控件不是容器控件,因此 Form 成为标签的父级。你可以看到表单的背景。

通过向表单构造函数添加一点代码,可以很容易地修复这个问题。您需要更改标签的 Parent 属性并重新计算它的 Location,因为它现在是相对于图片框而不是表单的。像这样:

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

运行时是这样的:

enter image description here


另一种方法是解决设计时问题。只需要一个属性。添加对 System 的引用。设计并向项目中添加一个类,粘贴以下代码:

using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;    // Add reference to System.Design


[Designer(typeof(ParentControlDesigner))]
class PictureContainer : PictureBox {}

你可以用

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

为了方便你的设计。 你可以把你的标签放在一个面板里。并设置面板的背景图像是你想要的每一个图像。设置标签背景是透明的

在 Windows 窗体中使用 Visual Studio,你可以通过将 制图;添加到 Form1.designer.cs中来对标签或其他元素应用透明度。这样,你就可以从属性面板中获得透明度(在外观 BackColor 中)。或者在 Designer.cs 背色 = 系统。绘图。颜色。透明;中编辑代码

这种方法对任何事情都有效,但是你需要处理位置、调整大小、移动等等。使用一种透明的形式:

        Form form = new Form();
form.FormBorderStyle = FormBorderStyle.None;
form.BackColor = Color.Black;
form.TransparencyKey = Color.Black;
form.Owner = this;
form.Controls.Add(new Label() { Text = "Hello", Left = 0, Top = 0, Font = new Font(FontFamily.GenericSerif, 20), ForeColor = Color.White });
form.Show();

在尝试了所提供的大多数解决方案都没有成功之后,以下方法对我很有效:

label1.FlatStyle = FlatStyle.Standard
label1.Parent = pictureBox1


label1.BackColor = Color.Transparent

您很可能没有将代码放入 load 函数中。如果你放入表单初始化部分,对象还没有被绘制,因此什么都没有发生。

一旦对象被绘制,然后装载函数运行,这将使表单透明。

   private void ScreenSaverForm_Load(object sender, EventArgs e)
{
label2.FlatStyle = FlatStyle.Standard;
label2.Parent = pictureBox1;
label2.BackColor = Color.Transparent;


}