对PictureBox的透明控制


68

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

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

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

Answers:


169

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;
    }

在运行时看起来像这样:

在此处输入图片说明


另一种方法是解决设计时问题。那只是一个属性。添加对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 {}

谢谢,它可以完美运行,但是图片框是自定义的ProgressBar,并且直到ProgressBar在标签位置增加时才显示下载详细信息,如何使它始终可见而不是仅在ProgressBar触摸时可见?这里一个!图片
Derezzed

1
我这样做了,直到我意识到我不需要画框。Label控件本身具有Image属性,如果不需要图像格式的简单方案,该属性可能就足够了。
拉里

9
同样,这不适用于ProgresBar标签下方。
Bitterblue 2014年

毕竟,可以使用ProgressBar来完成此技巧吗?如何?
ElektroStudios

2
特别是您的“ ...并重新计算它的位置,因为它现在相对于图片框而不是表格...”确实很有帮助!
PeterCo '19

40

你可以用

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

3
多数民众赞成在完美!,从未使用过标签的父属性。做得好。:)
Bravo

对我来说,“ Color.Transparent”显示为未知,而“ System.Drawing.Color.Transparent”在运行后失败...
kokbira 2015年

感谢您确认我的感觉,接受的答案不必要地冗长。另外,您可以在设计器中设置透明的BackColor,而无需将其写出来。
ElDoRado1239

谢谢。设置父项效果很好。将标签添加到PictureBox控件似乎还设置了Parent属性(例如pictureBox1.Controls.Add(label1);)。并且必须将标签FlatStyle设置为“标准”,以允许将标签BackColor设置为Color.Transparent。
LT Dan

10

您可以使用TextRenderer绘制文本,该文本将在没有背景的情况下进行绘制:

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

当totalpercent值更改时,刷新pictureBox:

pictureBox1.Refresh();

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

另外,也要看看另一个答案在这里和DrawText的参考这里


1
谢谢!这是唯一有助于将文本(透明背景)放在ProgressBar上的解决方案。
Prokurors

5

为您的设计提供方便。您可以将标签放在面板内。并设置面板的背景图片就是您想要的每张图片。设置标签背景是透明的


1
如果图像是动画gif,则此解决方案将不起作用。动画将无法用作面板的背景。
淳林

1

在尝试了大多数提供的解决方案而没有成功之后,以下对我有用:

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

label1.BackColor = Color.Transparent    

0

一种适用于所有事物的方法,但您需要处理位置,调整大小,移动等。使用透明形式:

        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();

-3

通过将Visual Studio与Windows窗体一起使用,可以通过使用System.Drawing添加将透明度应用于标签或其他元素进入Form1.Designer.cs。这样,您可以从“属性”面板(位于BackColor的“外观”中)获得“透明度”。或者只是在Designer.cs中编辑代码this.label1.BackColor = System.Drawing.Color.Transparent;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.