Índice de la sección dedicada a punto NET (en el Guille)

NotifyIconCS: 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 VB.NET

 

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.

En la versión de C# no añado explicaciones... las explicaciones, con pequeñas variantes, son tan válidas para VB.NET como para C#, por tanto, si quieres ver comentarios al código, te recomiendo que linkes con la página de VB.NET (el link está al principio de esta página).

Lo único que en esta página te explicaré son las cosas propias del C#, aunque, si miras los comentarios del código podrás entenderlo casi sin problemas.
Gracias por tu comprensión.

/*
 * 
'------------------------------------------------------------------------------
' NotifyIcon2CS                                                     (15/Ene/02)
' Segunda prueba de mostrar icono en la barra de tareas con C#
'
' 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
'------------------------------------------------------------------------------
 * 
 */
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace NotifyIcon2CS
{
    /// 
    /// Summary description for Form1.
    /// 
    public class Form1 : System.Windows.Forms.Form
    {
        //' Se declaran como variables los objetos NotifyIcon y el ContextMenu
        NotifyIcon NotifyIcon1 = new NotifyIcon();
        ContextMenu ContextMenu1 = new ContextMenu();
        



        private void Salir_Click(object sender, System.EventArgs e)
        {
            //' Este procedimiento se usa para cerrar el formulario,
            //' se usará como procedimiento de eventos, en principio usado por el botón Salir
            this.Close();
        }

        private void Restaurar_Click(object sender, System.EventArgs e)
        {
            //' Restaurar por si se minimizó
            //' Este evento manejará tanto los menús Restaurar como el NotifyIcon.DoubleClick
            Show();
            WindowState = FormWindowState.Normal;
            Activate();
        }

        private void AcercaDe_Click(object sender, System.EventArgs e)
        {
            //' Mostrar la información del autor, versión, etc.
            MessageBox.Show(Application.ProductName + " v" + Application.ProductVersion, "Prueba 2 de NotifyIcon en C#");
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            //' Asignar los submenús del ContextMenu
            //'
            //' Añadimos la opción Restaurar, que será el elemento predeterminado
//          MenuItem tMenu = new MenuItem("&Restaurar", new EventHandler(this.Restaurar_Click));
//          tMenu.DefaultItem = true;
//          ContextMenu1.MenuItems.Add(tMenu);
            //
            //' Esto también se puede hacer así:
            ContextMenu1.MenuItems.Add("&Restaurar", new EventHandler(this.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(this.AcercaDe_Click));
            //' Añadimos otro separador
            ContextMenu1.MenuItems.Add("-");
            //' Añadimos la opción de salir
            ContextMenu1.MenuItems.Add("&Salir", new EventHandler(this.Salir_Click));
            //'
            //' Asignar los valores para el NotifyIcon
            NotifyIcon1.Icon = this.Icon;
            NotifyIcon1.ContextMenu = this.ContextMenu1;
            NotifyIcon1.Text = Application.ProductName;
            NotifyIcon1.Visible = true;
            //
            // Asignamos los otros eventos al formulario
            this.Resize += new EventHandler(this.Form1_Resize);
            this.Activated += new EventHandler(this.Form1_Activated);
            this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);
            // Asignamos el evento DoubleClick del NotifyIcon
            this.NotifyIcon1.DoubleClick += new EventHandler(this.Restaurar_Click);
        }

        private void Form1_Resize(object sender, System.EventArgs e)
        {
            //' Cuando se minimice, ocultarla, se quedará disponible en la barra de tareas
            if( this.WindowState == FormWindowState.Minimized )
                this.Visible = false;
        }

        // la declaramos fuera de la función, para que mantenga su valor
        Boolean PrimeraVez = true;
        //
        private void Form1_Activated(object sender, System.EventArgs e)
        {
            // En C# no se puede usar static para hacer que una variable mantenga su valor
            // en C/C++ sí que se puede
            //static Boolean PrimeraVez = 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 )
            {
                PrimeraVez = false;
                Visible = false;
            }
        }

        private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // Cuando se va a cerrar el formulario...
            // eliminar el objeto de la barra de tareas
            this.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)
            this.NotifyIcon1 = null; 
            // de paso eliminamos el menú contextual
            this.ContextMenu1 = null; 
        }
    }
}

Y hasta aquí hemos llegado.

Nos vemos.
Guillermo

Aquí tienes los links al código de los ejemplos (y los ejecutables):
-Prueba 1, en tiempo de diseño: notifyiconCS.zip 11.8KB
-Prueba 2, en tiempo de ejecución: notifyicon2CS.zip 8.72KB

Si quieres el código de VB.NET, te vas a la página de la versión de VB.NET 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 .NET

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