none
Como Crear un Panel Semitransparente?

    Pregunta

  • Quiero hacer una simulacion de un lightbox (diseño web), pero en un programa creado en vb.net y para eso necesito que el panel sea semitransparente....
    Alguien sabe como se puede hacer... pq he probado con el BackColor=Color.Transparent y no resulta, tambien probe con MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True) y tampoco funciona....
    Ojala alguien pueda saber como hacer y de ante mano gracias.
    lunes, 10 de agosto de 2009 14:44

Respuestas

  • "dark_scamp" escribió:

    > con dejar el control panel en semitransparente, es hacer una simulacion de
    > un control que existe en diseño web, que se le llama lightbox, que sirve
    > para arrojar un mensaje, sin tener que crear un popup o en este caso,
    > sin tener que crear un formulario, para el mensaje.

    Pues si lo he entendido bien, creo que utilizando un formulario en lugar de un control Panel, tienes el asunto resuelto.

    Para ello, puedes utilizar una clase que herede de Form, y sobrescribir su propiedad Text para que muestre el texto en el área cliente del formulario. Esta clase, por ejemplo, podría ser algo parecido a la siguiente:

    Public Class FormTransparent

        Inherits Form

        Private _text As String

        Public Sub New()

            ' Inicializamos los controles del formulario
            '
            InitializeComponent()

            Dim tmr As New System.Windows.Forms.Timer

            ' El formulario se mostrará durante cinco segundos.
            With tmr
                .Enabled = True
                .Interval = 5000
                AddHandler .Tick, AddressOf TimerOnTick
            End With

            ' Configuramos el formulario.
            '
            With Me
                .BackColor = SystemColors.Info
                .ClientSize = New Size(390, 50)
                .FormBorderStyle = FormBorderStyle.None
                .Opacity = 0.5
            End With

        End Sub

        Private Sub TimerOnTick(ByVal sender As Object, ByVal e As EventArgs)

            ' Pasado el tiempo de espera, cerramos el formulario.
            Me.Close()

        End Sub

        Public Overrides Property Text() As String
            Get
                Return _text
            End Get
            Set(ByVal value As String)
                _text = value
            End Set
        End Property

        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

            Dim g As Graphics = e.Graphics

            Dim br As New SolidBrush(SystemColors.WindowText)

            ' Centramos el texto en el área cliente del formulario.
            '
            Dim centered As Rectangle = e.ClipRectangle

            centered.Offset(0, CInt(CInt(e.ClipRectangle.Height - g.MeasureString(_text, Font).Height) / 2))

            Dim sf As New StringFormat
            sf.Alignment = StringAlignment.Center

            g.DrawString(_text, Font, br, centered, sf)

            MyBase.OnPaint(e)

        End Sub

    End Class

    NOTA: En la clase he omitido intencionadamente el procedimiento «InitializeComponent», porque como bien podrás comprender, ignoro los controles que vas a insertar en el formulario.


    Cuando desees mostrar el formulario de información, ejecutarías lo siguiente:

            Dim frm As New FormTransparent

            ' Indicamos el texto que deseamos que aparezca.
            '
            frm.Text = "¡Hola, Formulario semitransparente!"

            ' Añadimos el formulario a la lista de formularios poseídos.
            '
            Me.AddOwnedForm(frm)

            ' Mostramos el formulario
            '
            frm.Show()

            ' En último lugar indicamos la posición donde
            ' deseamos que aparezca el formulario.
            '
            frm.Location = New Point(90, 70)

    Como añadimos el formulario a la lista de formularios poseídos, podrás minimizarlo cuando minimizes su formulario propietario. De otra manera no podrías minimizar el formulario transparente, ya que lo estás mostrando de una manera no modal, y sin ser hijo de un formulario MDI.

    La idea ya la tienes. Sería cuestión de retocarla para que se adapte a tus necesidades.

    Recuerda marca la respuesta como satisfactoria si la misma te ha servido para algo.


    Enrique Martínez [MS MVP - VB]
    martes, 11 de agosto de 2009 4:22
    Moderador
  • No tengo el gusto de conocer los "lightbox", pero si te refieres al efecto de presentar una imagen sobre un fondo gris oscuro, que es lo que aparece cuando se hace clic sobre una imagen en el enlace que me has indicado, sigo entendiendo que eso se puede hacer con un formulario, siempre y cuando desees que éste sea semitransparente, claro está.

    > Ahora si lo dejo MDI, ...

    Creo no haber dicho que necesitas utilizar un formulario MDI. Si lo he dicho, ahora rectifico y digo que no es necesario utilizar un formulario MDI; mostramos el formulario como poseído de otro formulario cualquiera:

            ' Añadimos el formulario a la lista de formularios poseídos.
            '
            Me.AddOwnedForm(frm)

    > el panel no es tan complicado, por que va ligado al formulario, ...

    Y si lo ignoras, te diré que un formulario también puede ir ligado a otro formulario, sin necesidad de que sea hijo de un formulario MDI.

    Lo que pasa que en éste último caso, el formulario que actúa de secundario (por llamarlo de alguna manera), no podrá ser transparente.

    Si lo deseas comprobar, cuando llames al formulario, hazlo de la siguiente manera:


            Dim frm As New FormTransparent

            ' Indicamos el texto que deseamos que aparezca.
            '
            frm.Text = "¡Hola, Formulario semitransparente!"

            ' Establecemos el contenedor principal del formulario.
            '
            frm.Parent = Me

            ' Mostramos el formulario
            '
            frm.Show()

            ' En último lugar indicamos la posición donde
            ' deseamos que aparezca el formulario.
            '
            frm.Location = New Point(90, 70)

    Y en el constructor del formulario "secundario" (nótese las comillas), tendrías que indicar que éste no debe mostrarse como una ventana de nivel superior:

            Me.TopLevel = False

    De ésta manera el formulario actuará como un control más existente en el formulario principal, y se moverá cuando se mueva el formulario que lo contiene.

    ¡En fin! Como tú dices, puedes seguir "leseando" con el formulario. :-))


    Enrique Martínez [MS MVP - VB]
    martes, 11 de agosto de 2009 17:30
    Moderador

Todas las respuestas

  • Para hacer el panel semitransparente, tenes que setearle la propiedad Opacity del formulario con el porcentaje de transparencia que queres que tenga.

    Aca te dejo unos links que explican un poco más.
    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.opacity.aspx
    http://msdn.microsoft.com/en-us/library/aa984338(VS.71).aspx

    Saludos,
    Sandro D. Garcia
    Colabora con el foro: Si este mensaje te es de utilidad marcalo como respuesta.
    lunes, 10 de agosto de 2009 15:39
  • No me sirve eso, porque me deja semitransparente TODO, y solo necesito el control "panel", no el formulario

    lunes, 10 de agosto de 2009 16:23
  • Hola:

    Si te refieres al control Panel de una aplicación Windows Form, para asignarle el control Transparente a su propiead BackColor, tendrás que indicar que dicho control no tiene un contenedor principal, que por defecto es el formulario donde lo has añadido en tiempo de diseño.

    En el evento Load del formulario que contiene al control Panel, ejecuta lo siguiente:

            ' Color de fondo del formulario.
            Me.BackColor = Color.AliceBlue

            ' Indicamos que el control Panel no tiene
            ' un contenedor principal.
            Panel1.Parent = Nothing

            ' Asignamos como transparente el color
            ' de fondo del control Panel.
            Me.Panel1.BackColor = Color.Transparent

    Como podrás observar, el formulario se verá del color AliceBlue

    Te advierto que cuando la propiedad Parent se establece a Nothing, el control se quita de la colección Controls de su control principal actual, que en principio será la colección Controls del formulario. Tampoco se podrán ver aquellos controles que se encuentren dentro del control Panel.

    En definitiva, podrás hacer transparente el control Panel, pero semitransparente no, al menos, ignoro por ahora cómo se puede hacer.

    Un saludo


    Enrique Martínez [MS MVP - VB]
    lunes, 10 de agosto de 2009 16:33
    Moderador
  • Hola:

    Si te refieres al control Panel de una aplicación Windows Form, para asignarle el control Transparente a su propiead BackColor, tendrás que indicar que dicho control no tiene un contenedor principal, que por defecto es el formulario donde lo has añadido en tiempo de diseño.

    En el evento Load del formulario que contiene al control Panel, ejecuta lo siguiente:

            ' Color de fondo del formulario.
            Me.BackColor = Color.AliceBlue

            ' Indicamos que el control Panel no tiene
            ' un contenedor principal.
            Panel1.Parent = Nothing

            ' Asignamos como transparente el color
            ' de fondo del control Panel.
            Me.Panel1.BackColor = Color.Transparent

    Como podrás observar, el formulario se verá del color AliceBlue

    Te advierto que cuando la propiedad Parent se establece a Nothing, el control se quita de la colección Controls de su control principal actual, que en principio será la colección Controls del formulario. Tampoco se podrán ver aquellos controles que se encuentren dentro del control Panel.

    Un saludo


    Enrique Martínez [MS MVP - VB]

    Revise tu respuesta, Pero lamentablemente no me sirve para lo que quiero, porque lo que me dices es como una simulacion de dejar al panel como la propiedad panel.visible=false, necesito que sea semitransparente, igual gracias por la respuesta porque me puede servir para otras cosas quisas.

    lunes, 10 de agosto de 2009 16:41
  • "dark_scamp" escribió:

    > Revise tu respuesta, Pero lamentablemente no me sirve para lo que quiero,
    > porque lo que me dices es como una simulacion de dejar al panel como la
    > propiedad panel.visible=false, ...

    No exactamente, porque si consultas el valor de la propiedad Visible del control Panel, su valor es True. :-)

    Desde luego, en estos momentos no puedo encontrarle una utilidad a un control Panel con su propiedad BackColor establecida en Transparent. ¿?

    Como continuación a mi anterior mensaje, te comento que tampoco es necesario establecer a Nothing el valor de la propiedad Parent del control Panel, porque con enviar el control al final del orden Z, es más que suficiente para que se pueden ver otros controles que haya insertados en el formulario, y que se encuentren "debajo" del control Panel:

            ' Asignamos como transparente el color
            ' de fondo del control Panel.
             Me.Panel1.BackColor = Color.Transparent

            ' Enviamos el control al final del orden Z
            Me.Panel1.SendToBack()

    De esta manera el control Panel sí estaría dentro de la colección Controls del formulario.

    > ... necesito que sea semitransparente

    Como te he indicado anteriormente, en estos momentos ignoro si se puede hacer semitransparente, ya que no dispone de una propiedad Opacity parecida a la de los formularios.


    Enrique Martínez [MS MVP - VB]
    lunes, 10 de agosto de 2009 16:54
    Moderador
  • bueno, si, esta en true, pero como dije es solo una "simulacion" :p

    Pero bueno, a lo que voy con dejar el control panel en semitransparente, es hacer una simulacion de un control que existe en diseño web, que se le llama lightbox, que sirve para arrojar un mensaje, sin tener que crear un popup o en este caso, sin tener que crear un formulario, para el mensaje. Solo colocar los controles en el panel "semitransparente" y que ejecute algun proceso que deseo, ya sea inicio de sesion, cargar algun archivos, mostrar opciones, etc...
    lunes, 10 de agosto de 2009 17:15
  • Hola mira este codigo pueda que te Sirva aqui solo se vuelve transparente el Panel y si tienes controles Como botones y Labels y otros esto te los dejara normal y el apnel se volvera transaprente


    pega el siguiente codigo dentro de la clase

     

     

     

    Public Class Form1
    
    End Class
    

        Public Sub New()
    
            ' Llamada necesaria para el Diseñador de Windows Forms.
            InitializeComponent()
    
            ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
    
            'key Transparency que volvera el control panel transparente
            Me.TransparencyKey = Color.WhiteSmoke
    
            'llamamos a la sub que vuelva el color transparente
            Me.MakeTransparentPanel(Me.Panel1)
    
        End Sub
        Private Sub MakeTransparentPanel(ByVal Panel As Panel)
    
            'ponemos el panel pariente al formulario
            Panel.Parent = Me
    
            'Key Transparente
            Panel.BackColor = Me.TransparencyKey
    
        End Sub



    Saludos.

    Melvin.
    Todo Es posible si se studia con exfuerso no importando lo de mas, Dios esta con nosotros y no hay mas sabiduria que la de Dios, Everything is posible Do not Turn Off Your Mind Remember Our Decision is Give EveryThing that We have , God Loves us Today Tomorrow and Always... Melvin Saludos U.S.A
    lunes, 10 de agosto de 2009 20:42
  • mmmm Se ve interesante el codigo, el problema que me muestra el fondo de la pantalla y no el fondo del formulario, vamos a ver si me sirve.... pero me sirve para ver otras funciones que no conocia
    lunes, 10 de agosto de 2009 21:59
  • "dark_scamp" escribió:

    > con dejar el control panel en semitransparente, es hacer una simulacion de
    > un control que existe en diseño web, que se le llama lightbox, que sirve
    > para arrojar un mensaje, sin tener que crear un popup o en este caso,
    > sin tener que crear un formulario, para el mensaje.

    Pues si lo he entendido bien, creo que utilizando un formulario en lugar de un control Panel, tienes el asunto resuelto.

    Para ello, puedes utilizar una clase que herede de Form, y sobrescribir su propiedad Text para que muestre el texto en el área cliente del formulario. Esta clase, por ejemplo, podría ser algo parecido a la siguiente:

    Public Class FormTransparent

        Inherits Form

        Private _text As String

        Public Sub New()

            ' Inicializamos los controles del formulario
            '
            InitializeComponent()

            Dim tmr As New System.Windows.Forms.Timer

            ' El formulario se mostrará durante cinco segundos.
            With tmr
                .Enabled = True
                .Interval = 5000
                AddHandler .Tick, AddressOf TimerOnTick
            End With

            ' Configuramos el formulario.
            '
            With Me
                .BackColor = SystemColors.Info
                .ClientSize = New Size(390, 50)
                .FormBorderStyle = FormBorderStyle.None
                .Opacity = 0.5
            End With

        End Sub

        Private Sub TimerOnTick(ByVal sender As Object, ByVal e As EventArgs)

            ' Pasado el tiempo de espera, cerramos el formulario.
            Me.Close()

        End Sub

        Public Overrides Property Text() As String
            Get
                Return _text
            End Get
            Set(ByVal value As String)
                _text = value
            End Set
        End Property

        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

            Dim g As Graphics = e.Graphics

            Dim br As New SolidBrush(SystemColors.WindowText)

            ' Centramos el texto en el área cliente del formulario.
            '
            Dim centered As Rectangle = e.ClipRectangle

            centered.Offset(0, CInt(CInt(e.ClipRectangle.Height - g.MeasureString(_text, Font).Height) / 2))

            Dim sf As New StringFormat
            sf.Alignment = StringAlignment.Center

            g.DrawString(_text, Font, br, centered, sf)

            MyBase.OnPaint(e)

        End Sub

    End Class

    NOTA: En la clase he omitido intencionadamente el procedimiento «InitializeComponent», porque como bien podrás comprender, ignoro los controles que vas a insertar en el formulario.


    Cuando desees mostrar el formulario de información, ejecutarías lo siguiente:

            Dim frm As New FormTransparent

            ' Indicamos el texto que deseamos que aparezca.
            '
            frm.Text = "¡Hola, Formulario semitransparente!"

            ' Añadimos el formulario a la lista de formularios poseídos.
            '
            Me.AddOwnedForm(frm)

            ' Mostramos el formulario
            '
            frm.Show()

            ' En último lugar indicamos la posición donde
            ' deseamos que aparezca el formulario.
            '
            frm.Location = New Point(90, 70)

    Como añadimos el formulario a la lista de formularios poseídos, podrás minimizarlo cuando minimizes su formulario propietario. De otra manera no podrías minimizar el formulario transparente, ya que lo estás mostrando de una manera no modal, y sin ser hijo de un formulario MDI.

    La idea ya la tienes. Sería cuestión de retocarla para que se adapte a tus necesidades.

    Recuerda marca la respuesta como satisfactoria si la misma te ha servido para algo.


    Enrique Martínez [MS MVP - VB]
    martes, 11 de agosto de 2009 4:22
    Moderador
  • Mira, en parte puede servir lo que me propones, pero el problema es que tendria que dejar al formulario principal MDI o tendria que lesear con la posición del formulario cuando lo hago aparecer, pero también tiene otro problema, que al colocarle componentes, los componentes también son afectados por el formulario, lo que no me serviria y por eso estaba probando con los paneles...
    martes, 11 de agosto de 2009 13:44
  • Si te soy sincero, te diré que no comprendo muy bien el contenido de tu último mensaje. :-(

    Desde luego, yo no veo por ningún lado donde está el problema, trabajes o no con un formulario MDI. ¿?

    Ignoro el significado del verbo "lesear", pero si es sinónimo de algo que significa "tener problemas para posicionar el formulario", digo yo que los mismos problemas tendrías para posicionar un control Panel, porque digo yo que éste control también tendrías que posicionarlo en algún lugar del formulario MDI. ¿O no es así?

    > pero también tiene otro problema, que al colocarle componentes, los componentes
    > también son afectados por el formulario, lo que no me serviria y por eso estaba
    > probando con los paneles...

    Esto, si me lo explicas mejor, lo mismo llego hasta entenderlo. :-))

    Que yo sepa, los componentes que yo conozco no tienen una interfaz visible para el usuario, y cuando se añaden en tiempo de diseño, se depositan en la Bandeja de Componentes, que es la parte que aparece debajo del diseñador de formularios de Visual Studio.

    Si te has fijado bien en el código fuente de la clase que he puesto de ejemplo, en ella estoy utilizando un componente Timer creado en tiempo de ejecución en lugar de crearlo en tiempo de diseño. Pues lo mismo puedes hacer con cualquier otro componente, al menos, con aquellos que yo conozco. :-)








    Enrique Martínez [MS MVP - VB]
    martes, 11 de agosto de 2009 16:15
    Moderador
  • Conoces los lightbox???, porque a eso es lo que quiero llegar....

    Ahora lesear es como tontear o realizar pruebas y pruebas hasta ver que resulte algo..... es mas o menos lo que pensabas... "tener problemas para posicionar el formulario"
    en parte no es tan complicado, porque podria encontrar varias soluciones a ese problema, por eso le digo "Lesear".... el panel no es tan complicado, por que va ligado al formulario, por lo que "Lesearia" menos, o tendria menos problemas, si el usuario quisiera mover el formulario... Ahora si lo dejo MDI, tendria quisas otras complicaciones, al momento de tratar de posicionar ensima de otros "Componentes" o controles, encambio el panel se puede superponer a otros paneles....

    Ahora te recordaras los controles tambien se les llama componentes :P, acuerdate del famoso InitializeComponent(), en donde se inicializan TODOS los CONTROLES.... y que significa InitializeComponent() InicializarComponentes :P....
    bueno ahora que te recorde lo que era el componente, podras enterder mejor lo que decia en..

    > pero también tiene otro problema, que al colocarle componentes, los componentes también son afectados por el formulario, lo que no me serviria y por eso estaba
    > probando con los paneles...

    y a que me refiero con afectados por el formulario, a que si coloco un boton o un label en el formulario semitransparente, este boton y label se vuelve tambien semitransparentes...

    Ahora te recomiendo, si aun sigues sin entenderme, visita esta pagina y pincha en alguna imagen y ve el efecto que se crea
    http://serennz.sakura.ne.jp/toybox/lightbox/
    martes, 11 de agosto de 2009 16:41
  • No tengo el gusto de conocer los "lightbox", pero si te refieres al efecto de presentar una imagen sobre un fondo gris oscuro, que es lo que aparece cuando se hace clic sobre una imagen en el enlace que me has indicado, sigo entendiendo que eso se puede hacer con un formulario, siempre y cuando desees que éste sea semitransparente, claro está.

    > Ahora si lo dejo MDI, ...

    Creo no haber dicho que necesitas utilizar un formulario MDI. Si lo he dicho, ahora rectifico y digo que no es necesario utilizar un formulario MDI; mostramos el formulario como poseído de otro formulario cualquiera:

            ' Añadimos el formulario a la lista de formularios poseídos.
            '
            Me.AddOwnedForm(frm)

    > el panel no es tan complicado, por que va ligado al formulario, ...

    Y si lo ignoras, te diré que un formulario también puede ir ligado a otro formulario, sin necesidad de que sea hijo de un formulario MDI.

    Lo que pasa que en éste último caso, el formulario que actúa de secundario (por llamarlo de alguna manera), no podrá ser transparente.

    Si lo deseas comprobar, cuando llames al formulario, hazlo de la siguiente manera:


            Dim frm As New FormTransparent

            ' Indicamos el texto que deseamos que aparezca.
            '
            frm.Text = "¡Hola, Formulario semitransparente!"

            ' Establecemos el contenedor principal del formulario.
            '
            frm.Parent = Me

            ' Mostramos el formulario
            '
            frm.Show()

            ' En último lugar indicamos la posición donde
            ' deseamos que aparezca el formulario.
            '
            frm.Location = New Point(90, 70)

    Y en el constructor del formulario "secundario" (nótese las comillas), tendrías que indicar que éste no debe mostrarse como una ventana de nivel superior:

            Me.TopLevel = False

    De ésta manera el formulario actuará como un control más existente en el formulario principal, y se moverá cuando se mueva el formulario que lo contiene.

    ¡En fin! Como tú dices, puedes seguir "leseando" con el formulario. :-))


    Enrique Martínez [MS MVP - VB]
    martes, 11 de agosto de 2009 17:30
    Moderador
  • Mira, estuve revisando tu respuesta, en si, lo que no sabia, era la segunda parte, en donde al colocarle Me.TopLevel = False, podia quedar como un control más, sin que quede como un MDI(Por eso lo mencione YO), me puede servir para otra cosa que estoy haciendo.... pero como tu dijiste no podrá ser transparente.... de alguna manera sera algo parecido a un panel, obviamente con mas caracteristicas, pero seguiria con el mismo dilema... sin poder hacer que el control se vuelva semitransparente....

    Ahora sobre la otra opcion que me diste, de alguna manera hace lo que necesito, pero tiene dos problemas que te he mencionado...

    El primero que los controles tambien queda semitransparentes, lo cual no me serviria....
    El segundo que hay que "acomodar", el formulario para que al momento de moverse uno se mueva el otro (cosa que = tiene su solucion)

    Lo ideal seria poder lograr que el formulario quede como un "MDI"(sin ser MDI), como en la otra opcion que me diste y q ahi se pueda dejar semitransparente....
    martes, 11 de agosto de 2009 18:08
  • "dark_scamp" escribió:

    > Ahora sobre la otra opcion que me diste, de alguna manera hace lo
    > que necesito, pero tiene dos problemas que te he mencionado...
    >
    > El primero que los controles tambien queda semitransparentes, lo cual no me serviria....

    Como decimos en mi pueblo, «no le pidas peras al olmo». Si el formulario es transparente, también lo serán sus controles o componentes. :-)

    > El segundo que hay que "acomodar", el formulario para que al momento
    > de moverse uno se mueva el otro (cosa que = tiene su solucion)

    Como te he indicado anteriormente, si el formulario "secundario" es un control más del formulario principal, aquel se moverá junto con el formulario que lo contiene, igual que si se tratara de un control.

    > Lo ideal seria poder lograr que el formulario quede como un "MDI"(sin ser MDI),
    > como en la otra opcion que me diste y q ahi se pueda dejar semitransparente....

    A mí, por ahora, ya no se me ocurren más ideas.




    Enrique Martínez [MS MVP - VB]
    martes, 11 de agosto de 2009 18:33
    Moderador
  • Aqui tambien se dice lo mismo... :P, pero como te dije, me interesaria mas tratar de alguna manera dejar semitransparente el formulario como control, ya que la otra opcion no serviria....
    de todos modos = te doy las gracias, porque igual lo q me has dicho me puede servir para otras cosas....
    martes, 11 de agosto de 2009 18:43