2012-02-22 68 views
55

透明控制在我的C#窗体我有一个显示在下载事件中下载百分比标签:在图片框

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

Label控件的背景色属性设置为是透明的,我希望它显示在一个PictureBox。但是这看起来没有正常工作,我看到一个灰色的背景,它在图片框顶部看起来不透明。我怎样才能解决这个问题?

回答

134

标签控制支持透明度良好。只是设计师不会让你正确放置标签。 PictureBox控件不是容器控件,因此Form变为标签的父项。所以你看到表单的背景。

这是很容易通过增加一个比特的代码给表单构造修复。您需要更改标签的Parent属性并重新计算它的位置,因为它现在是相对于图片框而不是表单。就像这样:

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.Design参考,并添加类到您的项目,粘贴此代码:

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

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

谢谢,它完美的作品,但在PictureBox是一个自定义的进度和下载细节不会出现,直到标签位置的进度增加,我怎样才能使它总是可见,而不仅仅是当进度触动呢? 这里a![图片](http://i.imm。io/h342.jpeg) – Derezzed 2012-02-22 03:28:15

+1

我这样做,直到我意识到我不需要一个picturebox。 Label控件本身具有Image属性,如果简单场景不需要图像格式化,则该属性可能已足够。 – Larry 2012-09-13 08:34:14

+1

只有在标签之前有一个图片框并且不是多个时,此功能才有效... – alap 2014-03-24 16:56:42

9

可以使用TextRenderer绘制文本将绘制它没有背景:

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

当overallpercent值的变化,刷新图片框:

pictureBox1.Refresh(); 

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

也请看另一个答案here和DrawText参考here

+0

谢谢!这是帮助在ProgressBar上放置文本(透明背景)的唯一解决方案。 – Prokurors 2015-07-24 12:37:57

32

你可以使用

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

多数民众赞成在完美!,从未使用标签的父母财产。做得好。 :) – Bravo 2014-07-27 18:52:56

+0

对我来说,“Color.Transparent”显示为未知,并且“System.Drawing.Color.Transparent”在运行后失败... – kokbira 2015-06-03 18:03:48

+0

感谢您确认我的感觉,接受的答案是不必要的漫长。另外,你可以在设计器中设置透明的BackColor,不需要写出来。 – ElDoRado1239 2015-08-09 03:51:49

4

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

+1

如果图像是GIF动画,此解决方案将不起作用。动画不会作为面板的背景。 – ChunLin 2016-05-07 14:08:19

-2

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