透明控制PictureBox

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

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

Label控件的BackColor属性被设置为透明的,我希望它被显示在一个PictureBox上。 但是,这似乎不能正常工作,我看到一个灰色的背景,它看起来不透明的图片框。 我该如何解决这个问题?

Label控件支持透明度。 只是devise师不会让你正确放置标签。 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; } 

在运行时看起来像这样:

在这里输入图像描述


另一种方法是解决devise时问题。 这只是一个属性。 添加一个对System.Design的引用,并添加一个类到你的项目中,粘贴下面的代码:

 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 

你可以使用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参考

为了方便您的devise。 您可以将标签放置在面板中。 并设置面板的背景图像是你想要的每个图像。 设置标签背景是透明的

在Windows窗体中使用Visual Studio,您可以使用System.Drawing添加透明度到标签或其他元素Form1.Designer.cs这样你就可以从属性面板(在外观的BackColor)有透明度。 或者只是编辑Designer.cs中的代码this.label1.BackColor = System.Drawing.Color.Transparent;