volver al índice de vb.net

NotifyIconVB: Añadir un icono a la barra de tareas de Windows.

Se muestra también cómo añadir menú contextual al icono de la barra de tareas.
Se explica cómo hacerlo en tiempo de diseño y de ejecución.

Publicado el 16/Ene/2002

 

Este mismo ejemplo también está disponible en C#


En este ejemplo, vamos a ver cómo añadir un icono a la barra de tareas.
También le vamos a añadir un menú contextual, el cual se mostrará al pulsar con el botón derecho del ratón.
Ese menú tendrá una opción para restaurar, la cual se llamará al hacer doble-click en dicho icono de la barra de tareas.

Los iconos en la barra de tarea de Windows (al lado del reloj), se suelen usar para aplicaciones que normalmente no están siempre visibles (o mostradas), por tanto los formularios de los ejemplos aquí mostrados se "ocultarán" al minimizarlos, de forma que sólo se queden en la barra de tareas (junto al reloj) cuando estén minimizados.

También veremos cómo indicarle a la aplicación que icono debe mostrar en el formulario y, cosa curiosa, hay que decirle qué icono queremos que tenga la aplicación una vez compilada. A diferencia del VB6, el cual usaba por defecto el que tenía el formulario de inicio, en .NET, (tanto en VB como en C#), hay que indicar explícitamente el icono a usar en el ejecutable.
También veremos cómo crear nuestros propios iconos usando el editor de iconos del Visual Studio.NET.

Te recuerdo que los ejemplos aquí mostrados están hechos con la beta2 del Visual Studio.NET Enterprise en español, por tanto, puede ser que el código fuente, al menos los ficheros con extensión .resx, no sean "compatibles" con otras versiones... eso es lo que suele ocurrir cuando se quieren usar los creados con versiones "posteriores" en otra anterior. Aunque tiene fácil solución, la cual consiste en "excluir" del proyecto dichos ficheros... aunque en casos excepcionales, este truquillo, puede que no funcione... lo aviso, para que no haya sorpresas...

Por último recordarte que los ejemplos de prueba, primero los he hecho en VB.NET y después he convertido el código a C#.
Adaptando la sistaxis para que funcione...
Creo que sería interesante crear una utilidad para convertir código de VB.NET a C# y viceversa...
¿Alguien se apunta? (esto es sólo una sugerencia, ya que no sé si algún día tendré tiempo de poder ponerme manos a la obra, aunque sería interesante, sobre todo porque así se podría "investigar" más en temas de conversión entre distintos lenguajes...)


Como te comentaba al principio, he creado dos ejemplos, uno asignando el contenido de los menús en tiempo de diseño y otro creándolos en tiempo de ejecución (runtime).
Para no aburrirte, (y de paso para no tirarme aquí cinco horas), sólo te voy a mostrar el código de la versión que crea los objetos en tiempo de ejecución, es decir cuando se ejecuta la aplicación.
Para ver el otro ejemplo, te bajas el código fuente y le echas un vistazo.

Lo que si te voy a explicar es cómo indicarle que icono queremos que use el formulario y cual es el que queremos que tenga el ejecutable una vez compilado.

 

Seleccionar el icono que mostrará el formulario:

A todos los formularios se les puede asignar un icono, el cual será el que se muestre en la parte superior izquierda del mismo, (en el caso de que se muestre el control box del formulario).
A diferencia de lo que ocurre con el VB6, cuando se compila el ejecutable en .NET, no se usa dicho icono para el ejecutable...
Para poder indicar ese icono del formulario, se hace mediante la ventana de propiedades, tal y como se muestra en esta imagen:

Para que se muestre el icono que nosotros queramos, tenemos que hacer lo siguiente:

Seleccionar el icono que tendrá el ejecutable:

Para indicar el icono que tendrá el ejecutable, hay que indicárselo explícitamente.
Ésto se hace en la ventana de propiedades del proyecto:

 

Crear nuestros iconos con Visual Studio .NET

Podemos crear los iconos que vayamos a usar en nuestras aplicaciones con el propio Visual Studio .NET.
Esto lo podemos hacer de dos formas:
Editando uno ya existente o creando uno nuevo.
Para editar uno existente, simplemente lo añadimos al proyecto y hacemos doble-click. Se mostrará el editor de iconos, del cual aquí vemos una captura:

Y si queremos crear uno desde cero, simplemente podemos añadir un nuevo elemento al proyecto, en este caso un icono:

En cuanto lo hagamos, se mostrará el editor de iconos.

Como comprenderás, no te voy a explicar cómo dibujar el icono... entre otras cosas, porque ese no es uno de mis fuertes...
Pero al menos sabes que puedes crear iconos y el editor, dentro de lo que cabe, es medianamente bueno... por lo menos es más completo que el Imagedit que suelo usar (venía en el CD del VB4)

 

Ahora vamos a ver el código... (ya era hora)

'------------------------------------------------------------------------------
' NotifyIcon2VB                                                     (15/Ene/02)
' Segunda prueba de mostrar icono en la barra de tareas con VB.NET
'
' Se usa el control NotifyIcon y un ContextMenu creado en ejecución
' También se asignan los eventos de los menús en runtime (ejecución)
'
' En C# se pueden asignar los procedimientos de eventos 
' directamente a los controles, así como al formulario.
' (como se hacía en la Preview del VB.NET)
'
' ©Guillermo 'guille' Som, 2002
'------------------------------------------------------------------------------
Option Strict On

Public Class Form1
    Inherits System.Windows.Forms.Form

    ' Se declaran como variables los objetos NotifyIcon y el ContextMenu
    ' El NotifyIcon hay que declararlo con WithEvents, para que soporte eventos
    Private WithEvents NotifyIcon1 As New NotifyIcon()
    Private ContextMenu1 As New ContextMenu()



    Private Sub Salir_Click(ByVal sender As Object, ByVal e As EventArgs) _
                    Handles btnSalir.Click
        ' Este procedimiento se usa para cerrar el formulario,
        ' se usará como procedimiento de eventos, en principio usado por el botón Salir
        Me.Close()
    End Sub

    Private Sub Restaurar_Click(ByVal sender As Object, ByVal e As EventArgs) _
                    Handles NotifyIcon1.DoubleClick
        ' Restaurar por si se minimizó
        ' Este evento manejará tanto los eventos usados para Restaurar
        ' El evento DoubleClick del NotifyIcon hay que asignarlo con Handles
        Show()
        WindowState = FormWindowState.Normal
        Activate()
    End Sub

    Private Sub AcercaDe_Click(ByVal sender As Object, ByVal e As EventArgs)
        ' Mostrar la información del autor, versión, etc.
        ' Este procedimiento se usará para los eventos de Acerca de...
        MessageBox.Show(Application.ProductName & " v" & Application.ProductVersion, "Prueba 2 de NotifyIcon con VB.NET")
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        ' Asignar los submenús del ContextMenu
        '
        ' Añadimos la opción Restaurar, que será el elemento predeterminado
        'Dim tMenu As MenuItem = New MenuItem("&Restaurar", New EventHandler(AddressOf Restaurar_Click))
        'tMenu.DefaultItem = True
        'ContextMenu1.MenuItems.Add(tMenu)
        '
        ' Esto también se puede hacer así:
        ContextMenu1.MenuItems.Add("&Restaurar", New EventHandler(AddressOf Restaurar_Click))
        ContextMenu1.MenuItems(0).DefaultItem = True
        '
        ' Añadimos un separador
        ContextMenu1.MenuItems.Add("-")
        ' Añadimos el elemento Acerca de...
        ContextMenu1.MenuItems.Add("&Acerca de...", New EventHandler(AddressOf AcercaDe_Click))
        ' Añadimos otro separador
        ContextMenu1.MenuItems.Add("-")
        ' Añadimos la opción de salir
        ContextMenu1.MenuItems.Add("&Salir", New EventHandler(AddressOf Salir_Click))
        '
        ' Asignar los valores para el NotifyIcon
        With NotifyIcon1
            .Icon = Me.Icon
            .ContextMenu = Me.ContextMenu1
            .Text = Application.ProductName
            .Visible = True
        End With
    End Sub

    Private Sub Form1_Activated(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Activated
        Static PrimeraVez As Boolean = True
        ' La primera vez que se active, ocultar el form,
        ' es una chapuza, pero el formulario no permite que se oculte en el Form_Load
        If PrimeraVez Then
            PrimeraVez = False
            Visible = False
        End If
    End Sub

    Private Sub Form1_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Resize
        ' Cuando se minimice, ocultarla, se quedará disponible en la barra de tareas
        If Me.WindowState = FormWindowState.Minimized Then
            Me.Visible = False
        End If
    End Sub

    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) _
                    Handles MyBase.Closing
        '// Cuando se va a cerrar el formulario...
        '// eliminar el objeto de la barra de tareas
        Me.NotifyIcon1.Visible = False
        '// esto es necesario, para que no se quede el icono en la barra de tareas
        '// (el cual se quita al pasar el ratón por encima)
        Me.NotifyIcon1 = Nothing
        '// de paso eliminamos el menú contextual
        Me.ContextMenu1 = Nothing
    End Sub
End Class

Creo que la cosa está más o menos clara... y lo que no esté claro... espero que los comentarios te sirvan un poco de ayuda.
Si por el contrario crees que debería haberlo explicado mejor o con más detalle... me lo dices, pero dime también lo que no has entendido en particular... nada de "generalidades", que no es ese el caso... tu escribe, ya veremos que es lo que hago... je, je.

Pues, con esto y un bizcocho...

Nos vemos.
Guillermo

Aquí tienes los links al código de los ejemplos (y los ejecutables):
-Prueba 1, en tiempo de diseño: notifyiconVB.zip 14.2KB
-Prueba 2, en tiempo de ejecución: notifyicon2VB.zip 9.09KB

Si quieres el código de la versión de C#, te vas a la página de la versión de C# y de allí te los bajas.

Te recuerdo que tanto los formularios como los ejecutables, están creados con el Visual Studio.NET Beta 2 español.


Ir al índice de vb.net

la Luna del Guille o... el Guille que está en la Luna... tanto monta...