2008-12-17 16 views
5

He creado un simple control de usuario que se crea manualmente con algo comoAjuste del padre de un control de usuario le impide ser transparente

MyUserControl ctrl = new MyUserControl(); 

El control se han diseñado para tener BackColor = Color.Transparent y eso funciona bien, hasta que configuro Parent del control en un formulario en el que se convierte en el color del formulario.

Parece que es transparente, pero lo que hace es esconder todos los controles que existen en el formulario también. No estoy 100% seguro de que sea el control que obtiene un fondo sólido o algo más que está sucediendo cuando lo conecto, lo que impide que se muestren otros controles.

Básicamente, si usted hace esto

  • crear un formulario
  • Caída de un botón en él
  • En el controlador de clic para el botón de hacer lo siguiente

Ejemplo

MyUserControl ctrl = new MyUserControl(); 
ctrl.Parent = this; 
ctrl.BackColor = Color.Transparent; 
ctrl.Size = this.Parent.ClientRectangle.Size; 
ctrl.Location = this.Parent.ClientRectangle.Location; 
ctrl.BringToFront(); 
ctrl.Show(); 

Básicamente I quiere que usercontrol superponga todo el formulario, mientras que muestra los controles subyacentes en el formulario (de ahí el fondo transparente). No quiero agregarlo a la colección de control de formularios porque realmente no pertenece al formulario, solo se muestra en la parte superior de todo lo demás

Intenté hacer lo mismo, pero sin configurar el elemento principal, pero luego el control no se mostró en absoluto.

Gracias!

EDITAR: Si anulo el método OnPaintBackground en el control de usuario y evito que se pinte el fondo, funciona, sin embargo, eso arruina las partes transparentes de una imagen PNG al pintar en el control usando DrawImage, lo cual tiene sentido.

Respuesta

6

Windows Forms realmente no es compatible con controles transparentes.
Puede evitar esta limitación anulando la propiedad CreateParams del control y configurando un estilo personalizado (búscalo en google).
Además, debe anular la pintura de su control para que no solo se vuelva a dibujar su control, sino también el control principal. La razón es que el fondo debe pintarse antes de que su control se proyecte a sí mismo.
Finalmente, debe anular el método OnPaintBackground, como lo ha hecho, para asegurarse de que no se haya pintado ningún fondo.

Bastante torpe, y no perfecto, pero debería funcionar.

+0

¿Quiere decir que debería usar el indicador WS_CLIPCHILDREN al crear la ventana de control? – TheCodeJunkie

+0

No, creo que te refieres a WS_EX_TRANSPARENT – TheCodeJunkie

+1

Acabo de buscarlo. debe O la propiedad ExStyle de los objetos CreateParams con EX_TRANSPARENT (0x00000020) –

Cuestiones relacionadas