我在这里创建一个程序可以添加标签和图片框。
所有控件必须是面板的子项。
我使用这样的代码:
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);
}
但结果显示如下:
答案 0 :(得分:3)
透明度适用于嵌套控件;但在winforms下不支持重叠控件。期。
您可以尝试使用两个标签解决方法,一个嵌套在面板 pb下面,其他PB 强>
以下是一个例子:
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.Invalidate
或Label
的特殊能力..
请注意代码中发生的所有事情,所以不要期望设计师会出现这些事情。编写代码使其在VS设计器中显示并不是那么容易......
答案 1 :(得分:0)
Windows窗体不支持真正的透明度,请仔细阅读。 http://www.broculos.net/2008/03/how-to-use-transparent-images-and.html#.Vq0q2jZuncc