Como posso fazer um controle genuinamente transparente?
-
08-07-2019 - |
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
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.
-
A propriedade
createparams
agora indica que o controle pode ser transparente. -
InvalidateEx
é necessário para invalidar região do pai, onde o controle é colocado -
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.