WinForms: Cómo crear un control transparente a otros controles

Fuente: Soporte técnico de Microsoft

PUBLICACIÓN RÁPIDA

PUBLICACIÓN RÁPIDA ARTÍCULOS PROPORCIONAN INFORMACIÓN DIRECTAMENTE DESDE DENTRO DE LA ORGANIZACIÓN DE SOPORTE TÉCNICO DE MICROSOFT. LA INFORMACIÓN CONTENIDA EN ESTE DOCUMENTO SE CREA EN RESPUESTA A EMERGENTES O ÚNICOS TEMAS, O ESTÁ PREVISTO SUPLEMENTO OTRA INFORMACIÓN DE KNOWLEDGE BASE.

Acción



Cuando un control transparente cubre otro control del formulario muestra el fondo en lugar del control oculto.

Causa



Los controles en formularios Windows Forms transparentes son transparentes con respecto a su objeto principal, no a otros controles. Es más parecido a camuflaje de transparencia transparencia en formularios Windows Forms. Un control transparente realmente no permite ver el control detrás de él a través del formulario. Pide a su elemento primario para dibujar su propio fondo en el control "transparente". Por esta razón, muestra el formulario detrás de él un control transparente, pero cubre todos los demás controles.

Solución



Para implementar la transparencia en relación con otros controles requiere hacer lo mismo pero a mayor escala: en lugar de simplemente buscar el elemento primario para dibujar en el fondo del control de primer plano, el control debe pedir todos los controles detrás de él para dibujar en el fondo. Esto sólo funciona para controles que proporcionan algún método para solicitar que dibujarán y no se actualizará automáticamente cuando cambia la imagen del control de fondo.

Más información



Aquí está el código de ejemplo para demostrar los controles primarios y relacionados en un mapa de bits que se pueden mostrar como imagen de fondo del control de dibujo.

<DllImport("user32.dll", SetLastError:=True)> _

Pública compartida función MapWindowPoints(ByVal hwndFrom As HandleRef, ByVal hwndTo As HandleRef, ByRef lpPoints As POINT, <MarshalAs(UnmanagedType.U4)> ByVal cPoints As Integer) como Int32

End Function









<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _

PUNTO de estructura pública

Público X As Integer



Público Y como entero

Public Sub New (ByVal X As Integer, ByVal Y As Integer)

Me.X = X

Me.Y = S

End Sub







Structur final

Dim backgroundCache como mapa de bits

Dim regeneraciones As Integer = 0

Protegido reemplaza Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)

' Primero pintar el fondo de nuestro principal







Si (backgroundCache Is Nothing), a continuación,

regeneraciones = regeneraciones + 1

backgroundCache = New Bitmap(Me.Width, Me.Height)

Dim g como gráficos = Graphics.FromImage(backgroundCache)

Dim rectángulo como rectángulo = Rectangle(0, 0, Me.Width, Me.Height) nueva

Si (no Me.Parent Is Nothing), a continuación,







' El origen de los gráficos para que coincida con el elemento primario de contrapartida.

Dim p como punto = nuevo punto

p.X = p.Y = 0

MapWindowPoints (nuevo HandleRef (Me, mango), nuevo HandleRef (primario, Parent.Handle), p, 1)

' el cliprect de contrapartida en el espacio principal





rectangle.Offset(p.X, p.Y)

Dim np PaintEventArgs como = PaintEventArgs(g, rectangle) nueva

Dim estado como GraphicsState = g.Save()

Try





g.TranslateTransform(-p.X, -p.Y)

' obtener el elemento primario para borrar el fondo

InvokePaintBackground (primario, np)

' Configurarla de nuevo en caso de OnPaintBackground la rosca

g.Restore(state)

estado = g.Save()

g.TranslateTransform(-p.X, -p.Y)

' indicar a los padres para pintar su primer plano

InvokePaint (primario, np)

Por último

g.Restore(state)

End Try

rectangle.Offset(-p.X, -p.Y)

Else

' Por cualquier razón, nuestra principal no puede pintar el fondo, pero necesitamos algún tipo de fondo

' ya que estamos transparentes.

g.FillRectangle (SystemBrushes.Control, rectángulo)

End If

Primer plano 'A continuación, pinte a nuestros hermanos'

Dim sibs como ControlCollection = Me.Parent.Controls

Para i As Integer = sibs. Recuento de 1 Step -1

Dim c As Control = sibs (i - 1)

' Sólo nos interesan los controles detrás de nosotros







Si, a continuación, c.Equals(Me)

Salir de

End If

' No se moleste si no compartimos espacio

Si (Me.Bounds.IntersectsWith(c.Bounds)), a continuación,

Dim p como punto = nuevo punto

' desplazamiento nuestro origen para que coincidan con el elemento del mismo nivel



p.X = Me.Bounds.X - c.Bounds.X

p.Y = Me.Bounds.Y - c.Bounds.Y

' el cliprect de contrapartida en el espacio del control relacionado





rectangle.Offset(p.X, p.Y)

Dim np PaintEventArgs como = PaintEventArgs(g, rectangle) nueva

Dim estado como GraphicsState = g.Save()

Try





' Guardar el estado, por lo que nos podemos deshacer el cambio

' para la próxima ir alrededor

estado = g.Save()

g.TranslateTransform(-p.X, -p.Y)

' indicar al control para pintar su primer plano

InvokePaint (c, np)

Por último

g.Restore(state)

End Try

End If

Siguiente

End If

Dim g2 como gráficos = pevent. Gráficos

G2. DrawImage (backgroundCache, 0, 0)

End Sub

DESCARGO DE RESPONSABILIDAD

MICROSOFT CORPORATION Y/O SUS RESPECTIVOS PROVEEDORES GARANTIZAN LA IDONEIDAD, FIABILIDAD O EXACTITUD DE LA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS CONTENIDOS EN ESTE DOCUMENTO. DICHA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS SE PROPORCIONAN "TAL CUAL" SIN GARANTÍA DE NINGÚN TIPO. MICROSOFT Y/O SUS RESPECTIVOS PROVEEDORES RENUNCIAN A TODA GARANTÍA Y CONDICIÓN RESPECTO A ESTA INFORMACIÓN Y GRÁFICOS RELACIONADOS, INCLUIDAS TODAS LAS GARANTÍAS IMPLÍCITAS Y LAS CONDICIONES DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN DETERMINADO, ESFUERZO RAZONABLE, TÍTULO Y AUSENCIA DE INFRACCIÓN. USTED ACEPTA ESPECÍFICAMENTE QUE EN NINGÚN CASO MICROSOFT O SUS PROVEEDORES SERÁN RESPONSABLES DE DAÑOS DIRECTOS, INDIRECTOS, PUNITIVOS, INCIDENTALES, ESPECIALES, CONSECUENTES NI NINGÚN DAÑO, INCLUIDOS, SIN LIMITACIÓN, DAÑOS POR PÉRDIDA DE USO, DATOS O BENEFICIOS, QUE SURJA DE O EN CUALQUIER FORMA RELACIONADA CON EL USO DE O INCAPACIDAD DE USO DE LA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS CONTENIDOS EN ESTE DOCUMENTO , YA SEA BASADO EN CONTRATO, AGRAVIO, NEGLIGENCIA, RESPONSABILIDAD ESTRICTA O DE LO CONTRARIO, INCLUSO SI TIENE MICROSOFT O CUALQUIERA DE SUS PROVEEDORES AVISADO DE LA POSIBILIDAD DE DAÑOS.
Propiedades

Id. de artículo: 943454 - Última revisión: 14 ene. 2017 - Revisión: 1

Comentarios