Pergunta

Eu preciso fazer um controle que mostra apenas um esboço, e eu preciso colocá-lo sobre um controle que está mostrando um vídeo. Se eu fizer meu controle transparente, em seguida, o vídeo é obscurecida, porque os controles transparentes são pintadas por seu controle pai eo vídeo não é pintado pelo controle; ele é mostrado usando DirectShow ou outra biblioteca, então ao invés do controle pai pinta sua BackColor.

Assim - Posso fazer um controle que não se pintou em tudo , salvo se do opaco? Dessa forma, o controle pai não iria pintar sobre o vídeo.

Eu sei que eu poderia fazer a fronteira entre quatro controles (ou mais, se eu quero que ele tracejada), mas é possível fazer o que eu quero usando apenas um controle?


rslite é certa - embora você não precisa mesmo ir tão longe para usar PInvoke como seu exemplo faz -. A propriedade Control.Region é inteiramente suficiente

Foi útil?

Solução

Você poderia tentar fazer uma Região com um interior buraco e definir a região de controle com SetWindowRgn.

Aqui está um exemplo (I couldn 't encontrar um melhor). A ideia é criar duas regiões e subtrair a um interior a partir da uma exterior. Eu acho que deve dar-lhe o que você precisa.

Outras dicas

Eu uso uma função substituído para que a partir do controle de classe.

  1. A propriedade createparams agora indica que o controle pode ser transparente.

  2. InvalidateEx é necessário para invalidar região do pai, onde o controle é colocado

  3. Você tem que desativar a pintura automática do backcolor do controle ( ')

    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
    

Você pode estender esta classe para fazer o seu próprio controle. Após a depuração da classe irá aparecer na caixa de ferramentas.

Espero que isso faz o truque.

Você pode tentar definir o Form.TransparencyKey propriedade. Se isso falhar, você pode usar DirectX para obter acesso ao frame buffer e desenhar diretamente a ele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top