visual transparentes transparente tag studio quitarle poner hacer fondo control con como colores admite c# winforms user-controls transparency

c# - transparentes - Establecer el padre de un control de usuario evita que sea transparente



label transparente c# (1)

Creé un control de usuario simple que se crea manualmente con algo así como

MyUserControl ctrl = new MyUserControl();

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

Puede sonar como transparente, pero lo que hace es ocultar 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 haces esto

  • Crear un formulario
  • Coloca un botón en él
  • En el controlador de clic para el botón, haz 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, quiero que usercontrol superponga todo el formulario, al tiempo 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

Traté de hacer lo mismo, pero sin configurar el elemento principal, pero luego el control no se muestra en absoluto.

¡Gracias!

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


Windows Forms realmente no admite 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 ya hizo, para asegurarse de que no se haya pintado ningún fondo.

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