C# PictureBox上放置Label,并设置透明

今天遇到这样的一个情况,在窗体设置了背景(backgroud)图片,然后在此窗体上放置GroupBox和Panel并把它们的背景改为Transparent时,移动窗体或者改变大小都会闪得很厉害。
无奈下试验了PictureBox,在PictureBox上放置Label,发现在窗体的双缓冲模式(DoubleBuffer)下,PictureBox并不闪,但是出现了另一种情况,Label设置为透明时会将下面的PictureBox的背景透明掉,如图:
显然这不是想要的结果,经过查找资料终于得到了一个解决方法,首先在窗体的Form_Load()中设置Label的Parent属性为PictureBox(这里假设PictureBox对象为pBox,Label对象为Lb1)。

即:

Lb1.Parent = pBox;

    然后在pBox的Paint事件中写如下代码:

private void pBox_Paint(object sender, PaintEventArgs e)
        {
            PictureBox pb = sender as PictureBox;
            foreach (Control C in pb.Controls)
            {
                if (C is Label)
                {
                    Label L = (Label)C;
                    L.Visible = false;
                    e.Graphics.DrawString(L.Text, L.Font, new SolidBrush(L.ForeColor),
                        new RectangleF(L.Left - pb.Left, L.Top - pb.Top, L.Width, L.Height));
                }
            } 
        }

最终效果图:

    现在简单说明一下过程。

    sender为调用这个事件的对象,将其转换为PictureBox类型。

    然后循环查找该PictureBox对象的所有子控件,如果是Label的话,就使其Visible失效,即不显示,然后使用绘图方法在原来的Label处用原Label的字体,颜色在原来的位置处绘制上原来的文字。

    RectangleF是创建了一个矩形,使文字在矩形中,这样的即使是使Label变窄,也可以绘制正确。

    当然,这也是有缺点的,比如Label必须是从左上角开始的,如果选择文字位置(TextAlign)不为TopLeft的话,绘制出来的结果和原来的结果就会有不同。

    大家如果还有更好的方法,欢迎交流!!

————————————————
版权声明:本文为CSDN博主「羽中仙灵」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yjn43422757/article/details/6820835

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值