【问题标题】:How do I make a genuinely transparent Control?如何制作真正透明的控件?
【发布时间】:2010-09-23 10:43:30
【问题描述】:

我需要制作一个只显示轮廓的控件,并且我需要将它放在显示视频的控件上。如果我让我的控件透明,那么视频就会被遮挡,因为透明控件是由它们的父控件绘制的,而视频不是由控件绘制的;它使用 DirectShow 或其他库显示,因此父控件绘制其背景色。

那么 - 我可以制作一个不被绘制的控件根本,除非它是不透明的?这样,父控件就不会在视频上绘制。

我知道我可以用四个控件制作边框(如果我想用虚线制作更多的控件),但是否可以只使用一个控件来做我想做的事情?


rslite 是正确的 - 尽管您甚至不需要像他的示例那样使用 PInvoke - Control.Region 属性就足够了。

【问题讨论】:

    标签: c# winforms transparency


    【解决方案1】:

    我使用类控件中的重写函数。

    1. createparams 属性现在指示控件可以是透明的。

    2. InvalidateEx 是使放置控件的父区域无效所必需的

    3. 您必须从控件 (') 禁用背景颜色的自动绘制

      Imports System.Windows.Forms.Design
      Imports System.Reflection
          Public Class TransparentControl : Inherits Control
              Protected Overrides ReadOnly Property CreateParams As CreateParams
                  Get
                      Dim cp As CreateParams = MyBase.CreateParams()
                      cp.ExStyle = cp.ExStyle Or 32 'WS_EX_TRANSPARENT
                      Return cp
                  End Get
               End Property
              Protected Sub InvalidateEx(rct As Rectangle)
                  Me.Invalidate(rct)
                  If IsNothing(Parent) Then Exit Sub
                  Parent.Invalidate(New Rectangle(Me.Location, rct.Size), True)
              End Sub
              Protected Sub InvalidateEx()
                  Me.Invalidate()
                   If IsNothing(Parent) Then Exit Sub
                   Parent.Invalidate(New Rectangle(Me.Location, Me.Size), True)
              End Sub
              Protected Overrides Sub OnPaintBackground(pevent As PaintEventArgs)
                  'MyBase.OnPaintBackground(pevent)
              End Sub
      
              Protected Overrides Sub OnPaint(e As PaintEventArgs)
                   MyBase.OnPaint(e)
                  'draw the layout on e.Graphics
              End Sub
          End Class
      

    您可以扩展此类以进行自己的控制。调试后类会出现在工具箱中。

    希望这能解决问题。

    【讨论】:

      【解决方案2】:

      您可以尝试设置Form.TransparencyKey 属性。如果做不到这一点,您可以使用 DirectX 访问帧缓冲区并直接绘制到它。

      【讨论】:

      • 我误读了这个问题。尽管可以使表单透明并通过它们显示视频,但对控件/子表单执行相同操作要困难得多,并且确实需要透明控件下的控件在更新时引发绘制事件。
      【解决方案3】:

      您可以尝试制作一个内部有洞的区域并使用 SetWindowRgn 设置控制区域。

      这是example(我找不到更好的)。这个想法是创建两个区域并从外部区域中减去内部区域。我认为这应该可以满足您的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多