如何制作一个真正透明的控件?

5
我需要制作一个控件,它只显示轮廓,并且我需要将它放置在正在显示视频的控件上。如果我使我的控件透明,那么视频就会被遮挡,因为透明控件是由其父控件绘制的,而视频则不是通过控件绘制的;它是使用DirectShow或另一个库显示的,因此父控件绘制其BackColor。因此 - 我能否制作一个控件,除了不透明的部分外,完全不会被绘制?这样,父控件就不会覆盖视频。我知道我可以用四个控件(或更多,如果我想要虚线)来制作边框,但是否可能仅使用一个控件来实现我的目标?rslite是正确的-尽管您甚至不需要像他的示例一样使用PInvoke-Control.Region属性完全足够。
3个回答

4
你可以尝试创建一个带有内部空洞的Region,并使用SetWindowRgn设置控制区域。
这里是一个示例(我找不到更好的了)。思路是创建两个区域,从外部区域中减去内部区域。我认为这应该能满足您的需求。

0

我使用了从控制类中重写的函数来实现这个功能。

  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
    

您可以扩展此类以创建自己的控件。调试后,该类将出现在工具箱中。

希望这能解决问题。


-1
你可以尝试设置Form.TransparencyKey属性。如果不行,你可以使用DirectX来获取帧缓冲并直接进行绘制。

我误读了问题。虽然可以使表单透明并通过它们显示视频,但对于控件/子窗体来说,要做到相同的效果要困难得多,并且需要在透明控件下的控件更新时引发绘制事件。 - Skizz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接