Formulario transparente
[Usando las propiedades Opacity y TransparencyKey del formulario]

Fecha: 9 de diciembre de 2003 (publicado 13/Dic/2003)
Autor: Emilio P�rez Egido - [email protected]

 
.

Existen 2 propiedades del objeto formulario que nos permiten modificar el grado de transparencia o de opacidad del formulario, de manera que podamos ver otros formularios o el escritorio de Windows a trav�s de nuestra aplicaci�n:

Ambas propiedades tienen utilidad a la hora de dise�ar formularios que interesen de manera especial al usuario.
Con Opacity podemos crear formularios que al iniciar o al cerrar var�en su opacidad entre los valores m�nimo y m�ximo para dar la sensaci�n de ir apareciendo desde la nada o de desvanecerse al cerrarse.
Con TransparencyKey podemos hacer transparente un control de un determinado color para que parezca que el formulario tiene un agujero a trav�s del cual podemos ver lo que hay detr�s del mismo.

En este ejercicio se crea un formulario con un control etiqueta (Label) que se hace transparente al asignar su color de fondo como valor de la propiedad TransparencyKey del formulario y, mediante el uso de un temporizador que permite disminuir de manera progresiva el valor de Opacity, el formulario, al cerrarse, se va desvaneciendo poco a poco hasta desaparecer

A continuaci�n sigue c�digo en Visual Basic:

' EJERCICIO CON LAS PROPIEDADES DEL FORMULARIO
' OPACITY Y TRANSPARENCE.KEY - 30/10/2003

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " C�digo generado por el Dise�ador de Windows Forms "

    Public Sub New()
        MyBase.New()

        'El Dise�ador de Windows Forms requiere esta llamada.
        InitializeComponent()

        'Agregar cualquier inicializaci�n despu�s de la llamada a InitializeComponent()

    End Sub

    'Form reemplaza a Dispose para limpiar la lista de componentes.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Requerido por el Dise�ador de Windows Forms
    Private components As System.ComponentModel.IContainer

    'NOTA: el Dise�ador de Windows Forms requiere el siguiente procedimiento
    'Puede modificarse utilizando el Dise�ador de Windows Forms. 
    'No lo modifique con el editor de c�digo.
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents btCerrar As System.Windows.Forms.Button
    Friend WithEvents btHueco As System.Windows.Forms.Button
    Friend WithEvents Tiempo As System.Windows.Forms.Timer
    Friend WithEvents btHuecoNo As System.Windows.Forms.Button
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container
        Me.Tiempo = New System.Windows.Forms.Timer(Me.components)
        Me.Label1 = New System.Windows.Forms.Label
        Me.btCerrar = New System.Windows.Forms.Button
        Me.btHueco = New System.Windows.Forms.Button
        Me.btHuecoNo = New System.Windows.Forms.Button
        Me.SuspendLayout()
        '
        'Label1
        '
        Me.Label1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
                    Or System.Windows.Forms.AnchorStyles.Left) _
                    Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
        Me.Label1.BackColor = System.Drawing.Color.FromArgb(CType(224, Byte), CType(224, Byte), CType(224, Byte))
        Me.Label1.Location = New System.Drawing.Point(24, 24)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(344, 184)
        Me.Label1.TabIndex = 0
        Me.Label1.Visible = False
        '
        'btCerrar
        '
        Me.btCerrar.Anchor = System.Windows.Forms.AnchorStyles.Bottom
        Me.btCerrar.BackColor = System.Drawing.Color.Lavender
        Me.btCerrar.Font = New System.Drawing.Font("Verdana", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.btCerrar.Location = New System.Drawing.Point(272, 232)
        Me.btCerrar.Name = "btCerrar"
        Me.btCerrar.Size = New System.Drawing.Size(96, 40)
        Me.btCerrar.TabIndex = 2
        Me.btCerrar.Text = "Cerrar formulario"
        '
        'btHueco
        '
        Me.btHueco.Anchor = System.Windows.Forms.AnchorStyles.Bottom
        Me.btHueco.BackColor = System.Drawing.Color.Lavender
        Me.btHueco.Font = New System.Drawing.Font("Verdana", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.btHueco.Location = New System.Drawing.Point(24, 232)
        Me.btHueco.Name = "btHueco"
        Me.btHueco.Size = New System.Drawing.Size(96, 40)
        Me.btHueco.TabIndex = 3
        Me.btHueco.Text = "Abrir ventana"
        '
        'btHuecoNo
        '
        Me.btHuecoNo.Anchor = System.Windows.Forms.AnchorStyles.Bottom
        Me.btHuecoNo.BackColor = System.Drawing.Color.Lavender
        Me.btHuecoNo.Font = New System.Drawing.Font("Verdana", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.btHuecoNo.Location = New System.Drawing.Point(144, 232)
        Me.btHuecoNo.Name = "btHuecoNo"
        Me.btHuecoNo.Size = New System.Drawing.Size(104, 40)
        Me.btHuecoNo.TabIndex = 4
        Me.btHuecoNo.Text = "Cerrar Ventana"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.BackColor = System.Drawing.Color.Navy
        Me.ClientSize = New System.Drawing.Size(392, 290)
        Me.Controls.Add(Me.btHuecoNo)
        Me.Controls.Add(Me.btHueco)
        Me.Controls.Add(Me.btCerrar)
        Me.Controls.Add(Me.Label1)
        Me.Name = "Form1"
        Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual
        Me.Text = "Opacity y TransparencyKey"
        Me.ResumeLayout(False)

    End Sub

#End Region

    'Al cargar el formulario
    Private Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
        'Posici�n inicial del formulario
        Me.Top = 150
        Me.Left = 150
        'sin botones de Max. / Min. / Cerrar
        Me.ControlBox = False
    End Sub

    'Poner el mismo color a la etiqueta Label1 y a la propiedad
    'TransparencyKey del formulario para que la etiqueta sea
    'transparente. Solo funciona con la pantalla a 16 millones de colores o m�s
    Private Sub btHueco_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btHueco.Click
        'hacer visible la etiqueta que usaremos como ventana
        Me.Label1.Visible = True
        'asignar el mismo color a la etiqueta y a TransparencyKey
        Me.Label1.BackColor = System.Drawing.Color.Gray
        Me.TransparencyKey = Me.Label1.BackColor
    End Sub

    'Bot�n Cerrar para iniciar el evento Form1_Closing
    Private Sub btCerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCerrar.Click
        Me.Label1.Visible = False
        Me.Close()
    End Sub

    'Evento de cierre del formulario
    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        'mientras el valor de Opacity no llegue a cero
        If Not (Me.Opacity = 0) Then
            'cancelar el cierre del formulario
            e.Cancel = True
            'AddHandler (Instrucci�n): asocia un evento con un manipulador de eventos:
            'se asocia el evento Trick del temporizador Tiempo con el procedimiento
            'hacia el que apunta el operador AddressOf.
            'AddressOf crea una instancia de delegado del procedimiento TickTiempo.
            'Es decir, conecta el temporizador Tiempo con un manipulador
            'de su evento Trick
            AddHandler Tiempo.Tick, AddressOf TickTiempo
            'iniciar el temporizador
            Tiempo.Start()
        End If
    End Sub

    'Manipulador del evento Trick del temporizador, se encarga de
    'disminuir la opacidad del formulario cada per�odo de tiempo
    'especificado por la propiedad interval del temporizador
    Private Sub TickTiempo(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Static i As Double = 1.0
        i -= 0.08
        Me.Opacity = i
        'si el formulario es ya invisible
        If Me.Opacity = 0 Then
            'detener el temporizador
            CType(sender, Timer).Stop()
            'cerrar el formulario
            Me.Close()
        End If
    End Sub

    'ocultar la etiqueta transparente
    Private Sub btHuecoNo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btHuecoNo.Click
        Me.Label1.Visible = False
    End Sub
End Class

Imagen del programa en funcionamiento

Imagen del programa

 

Fichero con el c�digo de ejemplo en Visual Basic 2003 (miliuco_transparente.zip - 55.1 KB)


ir al ndice