透明背景的用户控制

问题描述 投票:0回答:5

我有一个简单的用户控件,实际上只是一个面板,当我单击该面板时,将会添加一个子用户控件。该子项只是另一个用户控件,我将

width = 150px
height = 100px
和背景颜色设置为透明。它的中心还有一个 100 x 100 像素的文本框。

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

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

这是截图

enter image description here

我该如何解决这个问题?有没有

allowTransparency
或者类似的东西?

还有一个绘制顺序的问题,新添加的块总是在其他块的后面。

如果您想查看相关代码,请告诉我,但我认为没有任何相关内容。

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

编辑

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

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

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

c# .net graphics user-controls gdi+
5个回答
13
投票

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

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

你确实这么做了。 用户控件的父级是表单。 它首先尽职尽责地绘制自己,并在左侧和右侧产生灰色边缘。 您“希望”也能看到其他用户控件的像素。 但这不起作用,它只要求父级绘制,而不要求任何恰好重叠的“其他”控件。 这当然不是不可能的,只是丑陋且缓慢。 这篇知识库文章展示了该方法。 而是强调“丑陋”的绰号。 显然,您可以改进您的用户控件,从表面上看,在面板的左侧和右侧设置这些透明边缘是没有意义的。 因此,将面板的 Location 属性设置为 (0, 0),将 Dock 属性设置为 Fill。 现在,每个用户控件只不过是一个“节点”,您不需要也不想看到任何重叠的其他“节点”的片段。 在节点之间绘制任何线条都需要实现表单的 Paint 事件。 如果您确实需要这种透明度,那么您将不得不采取不同的做法。 您必须放弃为每个节点使用窗口的想法。 一种方法是只对它们进行绘制。 如果您按照正确的顺序执行此操作,那么您将毫无问题地模拟通过分层绘画创建的真正透明度,而不会在需要查看“背景”的地方绘制。 它也会快很多,控制装置很昂贵。然而,您将放弃使用控件的便利性,而必须编写代码。 鼠标点击测试之类的事情变得更加复杂。 如果文本框实际上不应该是标签(肯定是吗?),或者使用已经放弃使用窗口作为控件的 GUI 类库,那么它肯定会成为一个挂机。 就像 WPF 一样。 并且不要忘记,有很多库已经为您执行此操作,连接节点是一种非常常见的用户界面范例。 例如 Visio。

在 UserControl 的构造函数中尝试一下:


7
投票

你也可以试试这个:

2
投票

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

0
投票

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

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

您可以根据自己的情况尝试类似的方法。


这是我第一次在堆栈溢出上发帖,但让我开门见山。如果您确实想要原始问题所要求的效果,您可以使用 GraphicsPath、Region,并确保控件的窗口大小适合这个新区域。这是我用于圆形控件的示例。


0
投票

不确定这是否是最有效的方法,但它似乎适合我的场景。

快乐编码!

© www.soinside.com 2019 - 2024. All rights reserved.