2008-11-21 18 views
5

Necesito hacer un control que muestre solo un contorno, y tengo que colocarlo sobre un control que muestra un video. Si hago mi Control transparente, entonces el video se oscurece, porque los controles transparentes están pintados por su control principal y el video no está pintado por el control; se muestra con DirectShow u otra biblioteca, por lo que el control principal pinta su BackColor.¿Cómo hago un control genuinamente transparente?

Entonces, ¿puedo hacer un control que no se pinta en absoluto, excepto cuando es opaco? De esa forma, el control principal no se reflejaría en el video.

Sé que podría hacer que el borde entre cuatro controles (o más si lo quiero desvanecido), pero ¿es posible hacer lo que quiero con un solo control?


rslite está bien - a pesar de que ni siquiera es necesario ir tan lejos como para usar PInvoke al igual que su ejemplo no - Control.Region la propiedad es del todo suficiente.

Respuesta

4

Puede intentar hacer una Región con un agujero dentro y establecer la región de control con SetWindowRgn.

Aquí hay un example (No pude encontrar uno mejor). La idea es crear dos regiones y restar la interna de la externa. Creo que eso debería darte lo que necesitas.

-1

Puede intentar configurar la propiedad Form.TransparencyKey. De lo contrario, podría usar DirectX para acceder al búfer de cuadros y dibujar directamente en él.

+0

He leído mal la pregunta. Aunque los formularios pueden ser transparentes y mostrar video a través de ellos, hacer lo mismo con una forma de control/secundario es mucho más difícil y requiere controles bajo el control transparente para generar eventos de pintura en su actualización. – Skizz

0

Utilizo una función anulada para eso desde el control de clase.

  1. La propiedad createparams ahora indica que el control puede ser transparente.

  2. InvalidateEx es necesaria para invalidar la región de los padres donde se coloca el control

  3. Tienes que desactivar la pintura automática del color de fondo del 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 
    

Usted puede extender esta clase para hacer su propio control. Después de la depuración, la clase aparecerá en la caja de herramientas.

Espero que esto haga el truco.

Cuestiones relacionadas