문제

개요 만 표시하는 컨트롤을 만들어야하며 비디오를 보여주는 컨트롤 위에 배치해야합니다. 투명한 컨트롤이 부모 컨트롤에 의해 페인트되고 비디오가 컨트롤에 의해 페인트되지 않기 때문에 내 컨트롤을 투명하게 만들면 비디오가 가려집니다. DirectShow 또는 다른 라이브러리를 사용하여 표시되므로 대신 부모 컨트롤은 백색을 그립니다.

그래서 - 페인트 칠하지 않는 제어를 할 수 있습니까? 조금도, 불투명 한 곳을 제외하고? 그렇게하면 부모 컨트롤이 비디오를 통해 페인트되지 않습니다.

나는 4 개의 컨트롤 중에서 국경을 만들 수 있다는 것을 알고 있지만 (또는 내가 그것을 원한다면 더 이상) 하나의 컨트롤 만 사용하고 싶은 일을 할 수 있습니까?


RSLITE는 옳습니다. 비록 그의 예와 같이 Pinvoke를 사용하기까지 갈 필요조차 없습니다. Control.region 속성은 전적으로 충분합니다.

도움이 되었습니까?

해결책

내부에 구멍이있는 영역을 만들고 setwindowrgn으로 제어 영역을 설정하려고 시도 할 수 있습니다.

여기에 있습니다 예시 (더 나은 것을 찾을 수 없었습니다). 아이디어는 두 영역을 만들고 외부 지역에서 내부를 빼는 것입니다. 나는 그것이 당신에게 필요한 것을 주어야한다고 생각합니다.

다른 팁

클래스 컨트롤에서이를 위해 재정의 함수를 사용합니다.

  1. 그만큼 createparams 속성은 이제 제어가 투명 할 수 있음을 나타냅니다.

  2. InvalidateEx 제어가 배치 된 부모의 영역을 무효화하는 데 필요합니다.

  3. Control ( ')에서 백콜로의 자동 페인트를 비활성화해야합니다.

    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
    

이 클래스를 연장하여 자신의 제어를 할 수 있습니다. 디버깅 후 클래스가 도구 상자에 나타납니다.

이것이 트릭을 수행하기를 바랍니다.

당신은 설정을 시도 할 수 있습니다 Form.TransparencyKey 재산. 실패하면 DirectX를 사용하여 프레임 버퍼에 액세스하고 직접 그릴 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top