6

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

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

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

这是一个截图

在此处输入图像描述

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

绘图顺序也有问题,新添加的块总是在另一个块的后面。

如果您想查看此代码,请告诉我,但我认为与此无关。

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

编辑

在我什至想到在 StackOverFlow 中发布问题之前,我首先尝试了以下代码。

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

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

4

4 回答 4

9

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

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

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

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

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

于 2013-01-20T13:09:47.667 回答
7

在你的 UserControl 的构造函数中试试这个:

this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
于 2013-01-20T12:17:46.423 回答
2

你也可以试试这个:

     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);
         }
      }
于 2014-03-19T10:46:42.973 回答
0

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

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);

您可以在自己的上下文中尝试这样的事情。

于 2013-01-20T12:52:02.883 回答