如何在图片框C#中添加标签透明度?

时间:2016-01-30 21:20:29

标签: c#

我在这里创建一个程序可以添加标签和图片框。

所有控件必须是面板的子项。

我使用这样的代码:

panel2.Controls.Add(picturebox1);
panel2.Controls.Add(label1);

是的,问题是我想在图片框上贴标签。

我设置了代码:

label1.Parent = pictureBox1;
label1.BackColor = Color.Transparent;

更新

因为控件仅在我想通过button_event创建时创建。比如,创建图片框,创建标签文本。这不是在我想要使用它们之前创建的。

我创建此控件的代码:

public PictureBox ctrl = new PictureBox();

public void btnAddLogo_Click(object sender, EventArgs e)
{
    Random rnd = new Random();
    int randNumber = rnd.Next(1, 1000);
    String picName = "Pic_" + randNumber;
    ctrl.Location = new Point(200, 170);
    ctrl.Size = new System.Drawing.Size(100, 60);
    ctrl.Name = picName;
    ctrl.BackgroundImageLayout = ImageLayout.Zoom;
    ctrl.Font = new System.Drawing.Font("NativePrinterFontA", 10F, System.Drawing.FontStyle.Regular,
        System.Drawing.GraphicsUnit.Point, ((byte) (0)));
    ctrl.BackColor = Color.Chocolate;
    panel2.Controls.Add(ctrl);
}


private Label ctrLabel = new Label();

public void btnAddCharacter_Click(object sender, EventArgs e)
{
    Random rnd = new Random();
    int randNumber = rnd.Next(1, 1000);
    String LableName = "Lbl_" + randNumber;
    ctrLabel.Name = LableName;
    ctrLabel.AutoSize = true;
    ctrLabel.Text = txtIDImg.Text;
    ctrLabel.BackColor = Color.Transparent;
    panel2.Controls.Add(ctrLabel);
}

但结果显示如下:

Label not over in picture box. It gets panel is a parent. Panel 1 was added image

2 个答案:

答案 0 :(得分:3)

透明度适用于嵌套控件;但在winforms下不支持重叠控件。期。

您可以尝试使用两个标签解决方法,一个嵌套在面板 pb下面,其他PB

以下是一个例子:

enter image description here

    Label l1 = new Label() { Text = "Hello World", BackColor = Color.Transparent };
    Label l2 = new Label() { Text = "Hello World", BackColor = Color.Transparent };
    l1.Parent = scrollPanel;
    l2.Parent = picBox;
    Point pt  = new Point(picBox.Right - 30, 30);
    l1.Location = pt;
    pt.Offset(-picBox.Left, -picBox.Top);
    l2.Location = pt;

以上代码也可以放入可重用的函数中:

Label overlayLabel(Label source, Control target)
{
    Label old = source.Tag as Label;
    if (old != null && old.Parent == target) target.Controls.Remove(old);
    Label lbl = new Label();
    // copy all necessary properties here:
    lbl.Text = source.Text;
    lbl.Font = source.Font;
    lbl.AutoSize = source.AutoSize;
    lbl.Size = source.Size;
    lbl.Anchor = source.Anchor;  // may work or not!
    lbl.BackColor= source.BackColor;
    lbl.ForeColor = source.ForeColor;
    // etc..
    Point pt = source.Location;
    pt.Offset(-target.Left , -target.Top);
    lbl.Location = pt;
    lbl.Parent = target;
    source.Tag = lbl;
    return lbl;
}

在你的代码中你可能会这样称呼它;您可以存储返回的参考:

 panel2.Controls.Add(ctrLabel);
 Label ctrLabelOverlay = overlayLabel(ctrLabel, ctrl );

..或丢弃它,因为它负责清理上一个叠加层,该叠加层存储在Tag的{​​{1}}中..:

Label

最直接的方法是绘制那些东西,即文字和图片你自己。面板中的两行左右 panel2.Controls.Add(ctrLabel); overlayLabel(ctrLabel, ctrl ); 事件......:

Paint

您只需要计算两个位置if (img != null) { Rectangle rect = new Rectangle(pt1, img.Size); e.Graphics.DrawImage(img, rect); e.Graphics.DrawString("Hello World", Font, Brushes.Black, pt2); } pt1。如果您的Picturbox正在拉伸或缩放,您还需要将源矩形写入可以缩放/拉伸图像的pt2重载。

每当有变化时强制执行显示调用DrawImage

更简单,更强大,除非您需要panel2.InvalidateLabel的特殊能力..

请注意代码中发生的所有事情,所以不要期望设计师会出现这些事情。编写代码使其在VS设计器中显示并不是那么容易......

答案 1 :(得分:0)

Windows窗体不支持真正的透明度,请仔细阅读。 http://www.broculos.net/2008/03/how-to-use-transparent-images-and.html#.Vq0q2jZuncc