用户控制透明背景

时间:2013-01-20 12:12:27

标签: c# .net graphics user-controls gdi+

我有一个简单的用户控件实际上只是一个面板,当我在该面板中单击时,将添加一个子用户控件。那个孩子只是我设置width = 150px&的另一个用户控件。 height = 100px,背景颜色为透明。它的中心也有一个100 x 100像素的文本框。

这个基础结构将来会是一个基于节点的接口,每个盒子都有连接锚点和逻辑btn或类似的东西。

我的问题是,如果我在面板中单击几次并且添加的框与另一个框重叠,则透明度将不会生效。

这是截图

enter image description here

我该如何解决这个问题?有allowTransparency或类似的东西吗?

图纸的顺序也存在问题,新添加的块总是落后于另一个。

如果您希望看到此代码,请告诉我,但我认为没有任何相关内容。

另外,如果您知道实现节点图的更好方法,请随时告诉我。

修改

以下代码是我在尝试在StackOverFlow中发布问题之前尝试过的第一件事。

SetStyle(ControlStyles.SupportsTransparentBackColor, true);
MakeTransparentControls(this);

所以请不要将此作为重复的问题或将该代码作为答案发布

4 个答案:

答案 0 :(得分:8)

这通常是Windows中一个非常基本的限制。一个窗口与另一个窗口重叠,并阻挡其后面的任何东西。每个人最喜欢的答案,使用ControlStyles.SupportsTransparentBackColor,没有解决方法,它已经为UserControl打开,所以再次设置它没有任何区别。

样式标志模拟窗口透明度。它是通过改变窗户自我绘制的方式来实现的。它首先要求Parent在窗口内绘制以提供背景,然后将其自身绘制在其上。因此,通过将BackColor属性设置为Color.Transparent,您可以期望看到父窗口的像素作为背景。

你做到了。您的用户控件的父级是表单。它尽职尽责地自我绘制,并在左侧和右侧产生灰色边缘。你希望的目的是看到其他用户控件的像素。但这不起作用,它只要求父绘制,而不是任何碰巧重叠的其他控件。这当然不是不可能的,它只是丑陋而缓慢。这个KB article显示了这种方法。而是强调“丑陋”的绰号。

显然,你可以改进你的UserControl,面对它,面板的左侧和右侧没有任何意义。因此,将面板的Location属性设置为(0,0),将Dock属性设置为Fill。现在每个用户控件都只是一个“节点”,你不需要也不想看到任何重叠的其他“节点”。在节点之间绘制任何线条都需要实现表单的Paint事件。

如果你真的需要这种透明度,那么你将不得不以不同的方式做到这一点。你必须放弃为每个节点使用一个窗口的想法。一种方法是只绘制它们。如果你按照正确的顺序做到这一点,那么你就可以模拟真正的透明度,通过分层绘制创建,而不是绘制你需要看到“背景”的地方。它也会快得多,控制也很昂贵。然而,您将放弃使用控件的便利性,您将不得不编写代码。像鼠标测试这样的事情变得更加复杂。如果文本框实际上不应该是一个标签(当然可以吗?),那么文本框肯定会是一个挂断。或者使用已经放弃使用窗口作为控件的GUI类库。像WPF一样。并且不要忘记有很多库已经为您完成此操作,连接节点是一种非常常见的用户界面范例。例如,Visio。

答案 1 :(得分:5)

在UserControl的构造函数中尝试:

this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;

答案 2 :(得分:1)

你也可以试试这个:

     public partial class UCTransparent : UserControl
     {

         public UCTransparent()
         {
                InitializeComponent(); 
         }
         protected override CreateParams CreateParams
         {
                get
                {
                       CreateParams cp = base.CreateParams;
                       cp.ExStyle |= 0x20;
                       return cp;
                }
         }

         protected override void OnPaintBackground(PaintEventArgs e)
         {
             base.OnPaintBackground(e);
         }
      }

答案 3 :(得分:0)

在我的一个项目中,我必须为Form上的几乎每个子控件设置透明背景,所以我创建了这个方法:

private void MakeTransparentControls(Control parent)
{
    if (parent.Controls != null && parent.Controls.Count > 0)
    {
        foreach (Control control in parent.Controls)
        {
            if ((control is PictureBox) || (control is Label) || (control is GroupBox) || (control is CheckBox))
                control.BackColor = Color.Transparent;

            if (control.Controls != null && control.Controls.Count > 0)
                MakeTransparentControls(control);
        }
    }
}

在表单的构造函数中,我添加了这些行:

SetStyle(ControlStyles.SupportsTransparentBackColor, true);
MakeTransparentControls(this);

你可以在自己的背景下尝试这样的事情。