none
Label Transparente (Fondo transparente, realmente transparente) RRS feed

  • Pregunta

  • Hola amigos, soy bastante nuevo en el tema de la programación, creo que  seré un eterno estudiante dentro de este mundo, lo que ocurre es que me ha sorprendido el hecho de no poder darle transparencia real a un label, o sea a su fondo, la propiedad que se le asigna como transparent, solo hace que el mismo tome el color del parent, por defecto el formulario en el cual esta contenido, pero realmente necesito que el fondo sea transparente, algo así como se podía hacer con VB6 poniendo la propiedad Backstyle=0. Se que ya esto ustedes deben conocerlo, pero realmente no soy muy bueno explicandome asi que espero sepan disculparme y entenderme... Bueno, retomo la idea, googleando por ahi encontre ejemplos en los que crean el control, digamosle transparentLabel, y lo que netamente hacen es dibujarlo, ahora bien, he sido capaz de reutilizar el código, pero utilizan como es lógico: graphic y graphicpath para dibujarlo y en este tipo de cosas estoy mas que en pañales, pero el problema de que sea transparente el fondo del label se resuelve, lo que ocurre es que una vez quieras en tiempo de ejecución hacer click sobre el para llamar el evento click, por ejemplo, tienes que hacer click sobre las letras,  o sea que no podrías si quieres mover el label en tiempo de ejecución hacer click en el área que debe comprender el control porque no toma el evento y esto es lo que necesito lograr, me gustaría poder hacerlo por mi mismo, pero a la vez estoy contra reloj porque es algo que debo terminar pronto, así que pido su ayuda para que me orienten (porque verdaderamente necesito aprender) y si tienen algún ejemplo que pueda reutilizar, les estaré mas que agradecido, me serviría de mucho poder estudiar teniendo una guía, pero a la vez poder resolver el problema... espero no este pidiendo demasiado, les agradezco desde este momento, cualquier ayuda que me puedan ofrecer, aunque no tengan ejemplos que mostrarme, si pudieran guiarme para aprender de forma efectiva, seria mas que una gran ayuda. Si necesitan el código que reutilicé sin problemas solicítenmelo, no lo puse acá pues no sabia si seria de buen gusto... Gracias por su ayuda.
    domingo, 18 de julio de 2010 0:17

Respuestas

  • Si le comprendo lo que me quiere decir, pero por ahora, ignoro cómo va a poder hacer que el control Label sea totalmente transparente.

    ¿Ha probado el control Label que aparece en el enlace que le indicó Leandro Tuttini?

    Transparent Label .Net Control

    Pienso que es una buena aproximación al resultado que desea obtener.

    En cuanto al evento Click del que me habla, todo dependerá de cómo tenga implementada su clase. Si esa clase hereda de alguna otra que a su vez deriva de la clase Control, digo yo que dispondrá del evento Click, el cual se desencadenará cuando el usuario haga clic con el ratón sobre el control.

    Tenga en cuenta que un control Label es transparente referente a su control contenedor, que en el 90 por 100 de los casos es un control Form (un formulario cualquiera). Si el control Label tiene como contenedor a un objeto Button, por poner un ejemplo, el control Label será transparente referente al control Button. Por supuesto, la propiedad BackColor del control Label tiene que tener el valor Color.Transparent, porque de no ser así, entonces tomará el valor que tenga la propiedad BackColor de su control contenedor.

     


    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Cruznick miércoles, 21 de julio de 2010 19:48
    martes, 20 de julio de 2010 16:50

Todas las respuestas


  • se respondio en el foro de C#

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/a2441caa-99a0-43e6-b314-d21c99481fdb

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 18 de julio de 2010 1:05
  • Te respondo lo mismo que te he comentado en el foro de C#:

    Para hacer un control Label transparente, entiendo que no hace falta escribir tanto código, porque una vez que le hayas asignado el valor Transparent a su propiedad BackColor, lo único de lo que te tienes que preocupar es de enviar el control Label al final del orden Z de su contenedor, normalmente, al final del orden Z del formulario que lo contiene.

    ¿Qué deseas implementar una clase que herede del propio control Label? Pues fíjate lo fácil que lo tienes:

    using System;
    using System.Drawing;
    using System.Windows.Forms;

        class Translabel: Label
        {
            public Translabel()
            {
                base.BackColor = Color.Transparent;
            }

            protected override void OnParentVisibleChanged(EventArgs e)
            {
                // Enviamos el control al final del orden Z
                this.SendToBack();

                base.OnParentVisibleChanged(e);
            }
        }

    Lo que aparece en negrita son las únicas modificaciones que tienes que efectuar en tu clase personalizada del control Label. :-)

    Un saludo


    Enrique Martínez [MS MVP - VB]
    • Propuesto como respuesta Enrique M. Montejo domingo, 18 de julio de 2010 6:21
    • Votado como útil Cruznick domingo, 18 de julio de 2010 16:41
    domingo, 18 de julio de 2010 6:21
  • Le agradezco su respuesta, voy a intentarlo de esa forma, pero creo que no me supe explicar bien, segun entiendo lo que usted me propone es equivalente a asignarle backcolor como transparent y despues enviar el control detras, la propiedad transparent realmente no hace transparente el fondo del label, lo que hace es asignarle el color de fondo de su parent, si no me equivoco... lo que deseo lograr es el equivalente al backstyle=0 de VB6 que hace realmente el fondo transparente, porque necesito lograr que al mover el label (en tiempo de ejecucion) pase por donde pase (sobre otros label, textbox, panel, etc) realmente se vea lo que hay detras sin dejar de verse el texto que contiene mi label transparente, reutilizando el codigo que encontre y usted de seguro vio, logre el efecto que deseaba pero me encuentro con la dificultad de que para poder hacer click y llamar al evento click por ejemplo, se debe hacer click sobre las letras que contiene el translabel, o sea sobre el trasado de la letra, en los espacios en blanco que hay incluso que estan contenidos dentro de la letra, no se reconoce el evento, entiendo que esto ocurre porque lo que hace el codigo que reutilice, es dibujar demtro de un rectangulo las letras que le paso como texto, pero necesito que sin perder la transparencia del fondo, me reconozca como parte del translabel el area del rectangulo que contiene las letras (no se si me explico), porque usted se imagina que para poder llamar al evento click, haya que justo dar click encima del trazado de alguna de las letras, no es muy util, verdad? Le aclaro que el señor leandro Tuttini me dio una respuesta que aun no he podido probar, y bueno tampoco la suya, pero  por lo que he estado viendo en relacion a sus respuestas, no me supe explicar o hacer entender, pues me parece que con sus propuestas no logro el objetivo que persigo... Gracias

    ¿Me sorprende mucho que .net no soporte transparencia, y me refiero a la verdadera transparencia que se logra por ejemplo en VB6 (backstyle=0) como le comentaba anteriormente?

     

    Mil gracias, espero me puedan ayudar, y yo aprenda un poco mas a programar y a explicarme :)

    domingo, 18 de julio de 2010 16:40
  • "Cruznick" escribió:

    > Creo que no me supe explicar bien, segun entiendo lo que usted me propone
    > es equivalente a asignarle backcolor como transparent y despues enviar
    > el control detras, ...

    No es que sea equivalente; es, exactamente, lo que le he dicho que haga. :-)

    > la propiedad transparent realmente no hace transparente el fondo del label,
    > lo que hace es asignarle el color de fondo de su parent, si no me equivoco...

    Yo no lo veo así. Por defecto, la propiedad BackColor del control Label es la misma que tiene la propiedad BackColor de su objeto contenedor, generalmente la propiedad BackColor de un formulario. Es decir, si la propiedad BackColor del formulario es Yellow, éste será por defecto el color de la propiedad BackColor del control Label.

    > lo que deseo lograr es el equivalente al backstyle=0 de VB6 que hace
    > realmente el fondo transparente, porque necesito lograr que al mover el
    > label (en tiempo de ejecucion) pase por donde pase (sobre otros label,
    > textbox, panel, etc) realmente se vea lo que hay detras sin dejar de
    > verse el texto que contiene mi label transparente...

    Ignoro cómo va a poder imitar la propiedad BackStyle de los controles Label de Visual Basic 6.0.

    Lo más cercano sería utilizar la siguiente clase derivada del control Label:

        class Translabel: Label
        {
            public Translabel()
            {
                this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
                this.UpdateStyles();
            }

            protected override void  OnPaintBackground(PaintEventArgs pevent)
            {
                this.BackColor = System.Drawing.Color.Transparent;
                this.BringToFront();
                base.OnPaintBackground(pevent);
            }

        }

    Aunque el control Label sigue solapando a otros controles. Fíjese que en éste caso, el control Label tiene que estar al comienzo del orden Z.

    Ahora, en un formulario ejecutaría lo siguiente:

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                this.BackgroundImage = Image.FromFile(@"C:\Temp\Imagen1.jpg");
                this.BackgroundImageLayout = ImageLayout.Stretch;
                this.WindowState = FormWindowState.Maximized;

                Translabel lbl = new Translabel();
                lbl.AutoSize = true;
                lbl.Font = new Font(this.Font.FontFamily, 14);
                lbl.Location = new Point(70, 320);
                lbl.Text = "Este es el texto de mi control Label";
                this.Controls.Add(lbl);

                // En un punto cercano al control Label, vamos
                // a añadir un control Button un poco más grande
                // de lo normal.

                Button btn = new Button();
                btn.BackColor = Color.Transparent;
                btn.Location = new Point(90, 300);
                btn.Size = new Size(200, 100);
                btn.Text = "Texto del control Button";
                btn.UseVisualStyleBackColor = true;
                this.Controls.Add(btn);
                btn.SendToBack();
            }

        }

    Como podrá observar, el control Label sí deja ver completamente la imagen del formulario, pero no así una parte del control Button que solapa su rectángulo.


    Enrique Martínez [MS MVP - VB]
    lunes, 19 de julio de 2010 5:48
  • gracias por el tiempo que me ha dedicado, comprendo lo que me dice, pero no es lo que necesito lograr, si usted crea una biblioteca de control y pone el código que he reutilizado, y después agrega dicha biblioteca a un proyecto para probar el control, donde puede agregar imágenes, paneles, label (el estándar, no el control nuevo creado), vera a que me refiero:

    1- Cuando usted mueva el translabel (label transparente) verá que no importa, dentro de la ventana, delante de donde usted lo ponga, siempre podra ver lo que hay detras sin dejar de ver el texto del translabel.

    2- Pero se podrá dar cuenta que para poder hacer click en el translabel y llamar al evento, digamos el evento click en este caso (o el move en el caso anterior), para mostrar un messagebox, por ejemplo donde le diga al usuario: "Usted hizo click en el label de fondo transparente", en ese momento se encontrara con la dificultad que me encuentro y que no es otra que: para que esto ocurra (para que se lance el mensaje con el evento click) es necesario que el click que se haga con el mouse (en tiempo de ejecución por supuesto) sea sobre las letras que contiene el translabel, y me refiero a que justo va a tener que dar el click sobre la parte visible de la letra para poder desencadenar el evento (incluso verá que si dentro de la letra en el espacio en blanco(o sea transparente) que hay, por ejemplo dentro de una "o" si hace click ahí, no se va a desencadenar el evento porque para los efectos esa área no pertenece al translabel, al igual que no se desencadena si hace click en el área del translabel donde están las letras contenidas). Como usted supondra esto no es muy practico para un usuario, ya sea que necesite mover el label transparente o que necesite hacer click en el para recibir un mensaje (messagebox, por ejemplo).

     

    Mil disculpas, acabo de descubrir: no solo lo difícil que es hacer algo que creía tan sencillo :-) sino lo incapaz que soy de explicarme bien jajajaja y hacerme entender :-( Creo que nunca podría ser profesor, pobres estudiantes :-).

     

    Espero que me haya comprendido, y sobre todo que exista una forma de lograr lo que me planteo. Gracias por su paciencia y por sus respuestas, que aunque no sean justo lo que necesito aun así he ido aprendiendo, ya me apena molestarle tanto, espero que esta vez me haya sabido explicar bien :-)

                                       Saludos

    lunes, 19 de julio de 2010 13:07
  • Si le comprendo lo que me quiere decir, pero por ahora, ignoro cómo va a poder hacer que el control Label sea totalmente transparente.

    ¿Ha probado el control Label que aparece en el enlace que le indicó Leandro Tuttini?

    Transparent Label .Net Control

    Pienso que es una buena aproximación al resultado que desea obtener.

    En cuanto al evento Click del que me habla, todo dependerá de cómo tenga implementada su clase. Si esa clase hereda de alguna otra que a su vez deriva de la clase Control, digo yo que dispondrá del evento Click, el cual se desencadenará cuando el usuario haga clic con el ratón sobre el control.

    Tenga en cuenta que un control Label es transparente referente a su control contenedor, que en el 90 por 100 de los casos es un control Form (un formulario cualquiera). Si el control Label tiene como contenedor a un objeto Button, por poner un ejemplo, el control Label será transparente referente al control Button. Por supuesto, la propiedad BackColor del control Label tiene que tener el valor Color.Transparent, porque de no ser así, entonces tomará el valor que tenga la propiedad BackColor de su control contenedor.

     


    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Cruznick miércoles, 21 de julio de 2010 19:48
    martes, 20 de julio de 2010 16:50
  • Uhh bueno, al menos logre que me comprendiera, eso es un avance ¿no?, algo aprendi, jajaja... Muchas gracias, por todo su tiempo y esfuerzo, ya vere como me las arreglo, cuando lo logre le aviso y si le interesa le paso el codigo asi, podra ayudar a quien se encuentre en una situacion parecida a la que me encuentro ahora. Gracias tambien a Leandro Tuttini... supongo que de todo y algo que ponga yo ;-), debe salir una buena aproximacion :-)

    Hasta la próxima

    martes, 20 de julio de 2010 23:31
  • Me imaginó que a la altura que respondo este tema ya Cruznick habrá resuelto su problema. Sin embargo dejo la solución más práctica y simple para quienes tienen la misma inquietud.

    Si tengo por ejemplo un PictureBox y encima un Label. Al colocarle la propiedad BackColor del Label en Transparent el fondo del Label tomará el color del fondo del Formulario, para que el Label tomé el fondo del PictureBox lo unico que tenemos que hacer es decirle al Label que su "PAPA" es el PictureBox, es decir:

    Label1.Parent = PictureBox1

    Esto lo puedes hacer en el Load del Formulario.

    lunes, 12 de marzo de 2012 15:20
  • Hola Madachi

    Te agradezco por la respuesta, efectivamente ya logré resolver el problema... no obstante tu respuesta, aunque pudiera ser útil en otros casos no es lo que estaba necesitando, que pasa si el pictureBox donde tienes el label (con su backColor = Transparent, y cuyo parent es efectivamente el pictureBox) no ocupa todo el espacio del formulario y al hacer drag&drop del label, lo sacas fuera de su contenedor (o sea el picture) sorpresa (Inténtalo y veras que ocurre)!!! jejeje, yo necesitaba que el label fuera "Realmente" transparente... Color.Transparent realmente no da transparencia... La solución fue un UserControl.

    Saludos y muchas gracias...

    martes, 13 de marzo de 2012 3:14
  • Hola Cruznick..

    Estoy realizando una aplicacion en vb .net 2008 en la que cargo imagenes .png y luego las muevo y redimensiono, todo en tiempo de ejecucion,

    me puedes ayudar a realizar la transparencia??? tambien aumente un contextmenustrip pata las opciones: Traer al frente y enviar al fondo, pero

    no se como progamarlas!!!!

    me puedes ayudar!!! :) Gracias!!!!

    domingo, 25 de marzo de 2012 21:45
  • Hola Giss

    Donde quieres lograr Transparencia?? Las imágenes en formato PNG soportan transparencia (directamente cuando creas la imagen dejas el fondo transparente)... no me queda claro a que apuntas...

    Sobre el contextmenuStrip, pues no comprendí... supongo que te refieres  a desde el menú poder enviar al fondo o al frente un componente, intentaste usando "BringToFront()" para traer al frente y "SendToBack()" para llevar al fondo?

    Saludos


    • Editado Cruznick lunes, 26 de marzo de 2012 15:23
    lunes, 26 de marzo de 2012 15:22
  • Hola Madachi

    Te agradezco por la respuesta, efectivamente ya logré resolver el problema... no obstante tu respuesta, aunque pudiera ser útil en otros casos no es lo que estaba necesitando, que pasa si el pictureBox donde tienes el label (con su backColor = Transparent, y cuyo parent es efectivamente el pictureBox) no ocupa todo el espacio del formulario y al hacer drag&drop del label, lo sacas fuera de su contenedor (o sea el picture) sorpresa (Inténtalo y veras que ocurre)!!! jejeje, yo necesitaba que el label fuera "Realmente" transparente... Color.Transparent realmente no da transparencia... La solución fue un UserControl.

    Saludos y muchas gracias...

    Hola Cruznick tengo exactamente el problema que tu tuviste, nose si serias tan amable de compartir tu solución, de antemano muchas gracias...
    sábado, 22 de septiembre de 2012 13:47
  • Hola Cruznik

    Lo más simple es asignarle otro parent. El label toma por defecto el parent de form. Si lo colocas sobre un pictureBox por ejemplo, en el metodo constructor del form deberias asignarle el pictureBox al parent del label... Entonces la transparencia la hará con el pictureBox (o cualquier otro componente que le asignes). Tan simple como eso.

    Por ejemplo...

    public partial class formMain : Form
        {
            public formMain()
            {
                InitializeComponent();
                miLabel.Parent = miPictureBox;
            }

    }

    martes, 2 de octubre de 2012 16:47
  • Hola leonardo

    A simple vista esa parece la solución, pero depende del caso, puede o no serlo.... en mi caso particular no me sirve, la solucion fue hacer un control personalizado.

    Te dejo un tip para que lo veas según mi requerimiento... que pasa si tienes un Form con un label y un pictureBox, carga una imagen en el picture, el label debe estar en el form, ahora agarra el label en tiempo de ejecución y arrástralo haciendo que pase por sobre el pictureBox, verás lo que sucede aplicando la técnica que sugieres.... 

    es mas o menos lo que le describo a Madachi en una de mis respuestas anteriores.... En cuanto me desocupe dejo por acá la respuesta.

    Saludos

    sábado, 6 de octubre de 2012 22:43
  • BUenos días...

    hace semanas que estoy brujuleando por internet para conseguir un LABEL transparente en el que solo se vea lo que está escrito y, en el fondo, lo que esté debajo, sea lo que sea.

    Me explico... tengo un control VLC para reproducir stream de video que ocupa la totalidad de un formulario sin bordes ni barra de título para enviarlo a un segundo  monitor en el que sólo se visualiza el video. Lo que ahora quiero es escribir mensajes cortos sobre el video sin que tape a este, por qejemplo el título de la película. La idea es que salgan las letras sobreimpresas y entre los huecos de estass e siga viendo el video en el área que ocupe el LABEL.

    Nada de lo que he visto por internet funciona. INcluso he usado un user control (modificado de un label) que sí haceía lo que quería, pero en el momento de reproducir el video el label desaparece detrás del mismo... no valió nada de traerlo al frente, del orden Z, etc... anda de nada

    ¿Cuál fue tu solución?

    Gracias y un saludo


    Nitram

    miércoles, 16 de enero de 2013 9:56
  • Pero la linea

    miLabel.Parent = miPictureBox;

    como se escribe si estoy usando CLR de Visual Studio C++?

    Es que no hallo como ponerlo.

    viernes, 13 de diciembre de 2013 1:39
  • Saludos amigo, tengo el mismo problema que comento, tengo una pantalla con muchos campos de texto y labels, la idea es hacer algo como una marca de agua encima de los textos, por lo tanto no le puedo dar la propiedad parent a la imagen que tengo.

    Comento usted que la solución fue un userControl; ¿hay forma que la pueda explicar como lo logro?

    Gracias

    lunes, 17 de agosto de 2015 16:39