代码之家  ›  专栏  ›  技术社区  ›  TheCodeJunkie

设置用户控件的父级会使其不透明

  •  5
  • TheCodeJunkie  · 技术社区  · 16 年前

    我创建了一个简单的用户控件,它是手动创建的,类似于

    MyUserControl ctrl = new MyUserControl();
    

    控制装置的设计具有 背景色=颜色。透明的 这很好,直到我设置 父母亲 将控件转换为窗体,然后将其转换为窗体的颜色。

    听起来像是透明的,但它所做的是隐藏表单上存在的所有控件。我不能100%确定是控件获得了坚实的背景,还是当我连接它时发生了其他事情,从而阻止了其他控件的显示。

    基本上,如果你这样做

    • 创建表单
    • 在上面放一个按钮
    • 在按钮的点击处理程序中,您可以执行以下操作

    例子

    MyUserControl ctrl = new MyUserControl();
    ctrl.Parent = this;
    ctrl.BackColor = Color.Transparent;
    ctrl.Size = this.Parent.ClientRectangle.Size;
    ctrl.Location = this.Parent.ClientRectangle.Location;
    ctrl.BringToFront();
    ctrl.Show();
    

    基本上,我希望用户控件覆盖整个窗体,同时在窗体上显示底层控件(因此是透明背景)。我不想将它添加到表单控件集合中,因为它并不真正属于表单,它只是显示在其他所有内容的顶部

    我试着做同样的事情,但没有设置家长,但后来控件根本没有显示出来。

    谢谢!

    编辑:如果我覆盖用户控件中的OnPaintBackground方法并阻止绘制背景,那么它就可以工作,但是这会在使用DrawImage在控件中绘制PNG图像的透明部分时出错,这是有道理的。

    1 回复  |  直到 16 年前
        1
  •  6
  •   Rune Grimstad    16 年前

    Windows窗体并不真正支持透明控件。
    您可以通过覆盖控件的CreateParams属性并设置自定义样式(在谷歌上查找)来绕过这一限制。
    此外,您必须覆盖控件的绘制,以便不仅重新绘制控件,而且重新绘制父控件。原因是必须先绘制背景,然后才能绘制控件本身。
    最后,您应该像之前一样覆盖OnPaintBackground方法,以确保没有绘制背景。

    相当笨拙,也不完美,但它应该行得通。

    推荐文章