在使用.net 控件背景透明色时发现一个问题,.net 控件背景透明色并非真正透明,而是将其父容器的背景填充了控件的背景,造成透明的假相。当有两个控件透明且有重叠部分时,透明效果就会出现破绽,透明的区域居然能挡下面的控件,不能达到叠加透明的效果。在.net3.5下(不使用wpf)如何解决这个问题?

解决方案 »

  1.   

    那就自己写Graphics,截取背景,然后填充
      

  2.   

    .net的TK其实就是颜色的过滤透明效果,有个不透明的,颜色不等于TK,那么肯定不会被过滤。
      

  3.   

    这只能自己写混合函数了,参见DirectX的实现。其实混合写也不是很难。比如三种颜色ABC,A为背景,B为中间透明色,opacity = 50%,C为最外层,opacity = 60%,就可以这么写。C.A = C.A * 0.6 + (A.A*0.5+B.A*0.5)*0.4;
    C.R = C.R * 0.6 + (A.R*0.5+B.R*0.5)*0.4;
    C.G = C.G * 0.6 + (A.G*0.5+B.G*0.5)*0.4;
    C.B = C.B * 0.6 + (A.B*0.5+B.B*0.5)*0.4;
      

  4.   

     this.pictureBox1.Controls.Add(this.label1);//在窗体设计器生成的构造函数里
                this.label1.BackColor = Color.Transparent;
    自己做了个相对于图片上是透明的
      

  5.   

    2个叠加后,的确会出现一些问题。。
    在pictureBox的Paint事件中写下如下代码private void pictureBox1_Paint(object sender, PaintEventArgs e)        {            foreach (Control C in this.Controls)            {                if (C is Label)                {                    Label L = (Label)C;                   L.Visible = false;                    e.Graphics.DrawString(L.Text, L.Font, new          SolidBrush(L.ForeColor), L.Left - pictureBox1.Left, L.Top - pictureBox1.Top);                }            }        }或者在载入页面的时候在LOAD中写入下面代码:pictureBox1.SendToBack();            label1.BackColor = Color.Transparent;            label1.Parent = pictureBox1;            label1.BringToFront();这里是2种方法。。