Il controllo Menustrip in .Net 3.5

In questo articolo, vedremo come utilizzare la classe menustrip per la gestione dei menu in ambiente windows Application.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

 

Figura 1

In questo articolo verrà illustrato il  controllo per i menu ossia la classe menustrip, il quale amplia il controllo mainmenu che continuerà ad esserci.

In particolare vedremo come creare un menu con icone accanto alle singole voci (figura 1), una combobox  ed una casella di tipo testo situate nelle voci di menu strumenti (figura 2).

Il menustrip è una nuova classe, già presente con la versione del framework 2.0, il quale amplia di molte le funzionalità del controllo mainmenu, il quale continua ad esserci, in questo nuovo controllo sono stati aggiunti nuovi eventi, nuovi metodi e nuove proprietà. Questo articolo avrà il compito di illustrare alcune di queste  funzionalità.

 

Figura 2

Creazione del menu in modalità disegno “Design time”

Avviamo Visual Studio 2008, e si crea un nuovo progetto windows. Trasciniamo sulla form il controllo menustrip, situato nella barra degli strumenti, a questo punto facciamo clic su tale controllo e nella parte superiamo, scriviamo la parola File.

Fatto ciò facciamo click sulla parte inferiore della parola appena scritta, e digitiamo la parola apri, a tale voce inseriamo un icona, per far ciò, facciamo click con il tasto destro del mouse (figura 3) e nel menu di scelta rapida (figura 3) selezioniamo la voce imposta immagine o in alternativa, nella finestra delle proprietà selezionate la voce image. Verrà visualizzata una finestra (figura 4) la quale tramite il pulsante con la dicitura “importa...” ci permette di importare nel nostro progetto un oggetto di tipo immagine, selezionandolo nel nostro computer.

 

 

Figura 3

A questo punto selezioniamo la nostra icona e facciamo click sul pulsante ok, verrà visualizzata accanto alla parola Apri, la nostra icona appena selezionata. Aggiungiamo un’altra voce di menu, sotto la voce del menu  creato precedentemente, e scriviamo la parola esci, a questo punto inseriamo anche a questa voce, un icona, sempre facendo click con il tasto destro del mouse e selezionare dal menu di scelta rapida la voce "Imposta  immagine".

 

 

Figura 4

A questo punto il nostro menu sarà come mostrato in figura 1.

Inseriamo un’altra voce dopo la dicitura file, scriviamo la parola Strumenti,  sotto a tale voce scriviamo la parola citta, sempre tramite il menu di scelta rapida (tasto destro del mouse) selezioniamo la voce converti in, e selezioniamo la voce combobox (figura 5)  tale impostazione ci permette di avere una voce di menu formato combobox.

 

 

Figura 5

Per riempire tale combobox con dei valori, dobbiamo fare click con il tasto destro e selezionare la voce proprietà,  nella finestra delle proprietà selezioniamo la voce (proprietà) items. A questo punto verrà aperta una finestra dov’è possibile inserire dei valori, per esempio digitiamo le seguenti voci (Roma, Catania e Firenze).

Facciamo click sotto alla voce di menu appena creato, e digitiamo la parola trova, a questo punto facciamo click con il tasto destro del mouse, e nel menu di scelta rapida selezioniamo la voce converti in e poi la voce textbox. Ogni menu in base al tipo impostato, avrà degli eventi, per esempio per il menu di tipo combobox,  l’evento TextChanged ci indicherà quando il testo della combobox cambia.

Mentre per il menu di tipo textbox utilizzeremo l’evento LostFocus per sapere quando perde il focus, e quindi per esempio utilizzarlo come ricerca di parole nei nostri programmi, tipo la guida in linea di Microsoft Word, situata nella barra dei menu.

Creazione di un menu a run time

Il codice riportato qui di seguito illustra la creazione di un menu a run time(quando il programma è in esecuzione), con determinate formattazioni.

Prendendo come esempio il menu precedentemente creato, vedremo come ripetere tale operazione, quando il programma è in esecuzione tramite righe di codice.

Prima di tutto bisogna creare un oggetto di tipo menustrip, il quale rappresenta tutte le voci e sotto voci del menu.

Per ogni voce che si vuole creare, dobbiamo utilizzare l’oggetto di tipo toolstripmenuitem , il quale rappresenta una singola voce di menu. La proprietà text di tale oggetto ci permette di inserire il testo, mentre la proprietà image permette di inserire un immagine. Se vogliamo abbinare a tale voce un evento dobbiamo crearci una funzione, la quale viene richiamata tramite la parola chiave addressof(vb.Net) o += (C#), che avrà il compito di “indirizzare” l’evento dell’oggetto alla nostra funzione creata.

Utilizzando la classe My (vb.net) o properties (C#) abbiniamo le icone del progetto, alle singole voci di menu, la classe My o Properties  possono contenere diverse risorse, quali bmp, ico, ecc. Tali icone sono state inserire in precedenza. Per aggiunge la sottovoce al menu dobbiamo utilizzare il metodo add della proprietà DropDownItems dell’oggetto ToolStripMenuItem, infatti esso permette di inserire sotto ad una voce di menu(item) un sottomenu (subitem).

Di seguito è riportato il codice delle suddette dichiarazioni, :

VB.Net
Private Sub FrmCreaMenuRuntime_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'menu principale
        Dim MnsMenu As New MenuStrip()
        'item file
        Dim mntItemMenuFile As New ToolStripMenuItem()
        mntItemMenuFile.Text = "File"
        'item apri
        Dim mntItemMenuApri As New ToolStripMenuItem
        mntItemMenuApri.Text = "Apri"
        mntItemMenuApri.Image = My.Resources.open
        'creo un riferimento all'evento click
        AddHandler mntItemMenuApri.Click, AddressOf MenuApri_click
        'inserisco nell'item file la sottovoce
        mntItemMenuFile.DropDownItems.Add(mntItemMenuApri)
        'item Esci
        Dim mntItemMenuEsci As New ToolStripMenuItem
        mntItemMenuEsci.Text = "Esci"
        mntItemMenuEsci.Image = My.Resources.exit1
        'creo un riferimento per l'evento click
        AddHandler mntItemMenuEsci.Click, AddressOf MenuChiudi_Click
        'inserisco nell'item file la sottovoce
        mntItemMenuFile.DropDownItems.Add(mntItemMenuEsci)
        'inserisco i vari item
        MnsMenu.Items.Add(mntItemMenuFile)
        'creo il secondo item strumenti
        'item strumenti
        Dim mntItemMenuStrumenti As New ToolStripMenuItem
        mntItemMenuStrumenti.Text = "Strumenti"
        'item combo
        Dim MntItemMenuCitta As New ToolStripComboBox
        Dim StrCitta() As String = {"Roma", "Milano", "Firenze"}
        MntItemMenuCitta.Items.AddRange(StrCitta)
        'creo l'evento per la combo
        AddHandler MntItemMenuCitta.TextChanged, AddressOf MenuCitta_TextChange
        'aggiungo l'item combo agli strumenti
        mntItemMenuStrumenti.DropDownItems.Add(MntItemMenuCitta)
        'item textboxt
        Dim MntItemMenuTrova As New ToolStripTextBox
        MntItemMenuTrova.Text = "Trova"
        'creo l'evento per la voce trova
        AddHandler MntItemMenuTrova.LostFocus, AddressOf MenuTrova_LostFocus
        'aggiungo un item al menu strumenti
        mntItemMenuStrumenti.DropDownItems.Add(MntItemMenuTrova)
        'aggiungo l'item strumenti al menu
        MnsMenu.Items.Add(mntItemMenuStrumenti)
       
        Me.Controls.Add(MnsMenu)
    End Sub
    'Evento per la voce di menu esci
    Private Sub btnesci_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Me.Close()
    End Sub
    'Evento per la voce di menu apri
    Private Sub MenuApri_click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim DlgApri As New OpenFileDialog
        DlgApri.ShowDialog()
    End Sub
    'evento chiudi
    Private Sub MenuChiudi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Me.Close()
    End Sub
    'evento per il menu citta
    Private Sub MenuCitta_TextChange(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim MnuItemCitta As ToolStripComboBox = CType(sender, ToolStripComboBox)
        MessageBox.Show("La città selezionata è: " & MnuItemCitta.Text)
    End Sub
    'Evento per il menu  trova
    Private Sub MenuTrova_LostFocus(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim MnuItemTrova As ToolStripTextBox = CType(sender, ToolStripTextBox)
        MessageBox.Show("Vuoi trovare la parola: " & MnuItemTrova.Text)

    End Sub

C#
 
private void FrmCreaMenuRuntime_Load(object sender, EventArgs e)
        {
            //menu principale
            MenuStrip MnsMenu = new MenuStrip();
            //item file
            ToolStripMenuItem mntItemMenuFile = new ToolStripMenuItem();
            mntItemMenuFile.Text = "File";
            //item apri
            ToolStripMenuItem mntItemMenuApri = new ToolStripMenuItem();
            mntItemMenuApri.Text = "Apri";
            mntItemMenuApri.Image = Properties.Resources.open;
            //creo un riferimento all'evento click
            mntItemMenuApri.Click += new EventHandler(mntItemMenuApri_Click);
            //inserisco nell'item file la sottovoce
            mntItemMenuFile.DropDownItems.Add(mntItemMenuApri);
            //item Esci
            ToolStripMenuItem mntItemMenuEsci = new ToolStripMenuItem();
            mntItemMenuEsci.Text = "Esci";
            mntItemMenuEsci.Image = Properties.Resources.exit1;
            //creo un riferimento per l'evento click
            mntItemMenuEsci.Click += new EventHandler(mntItemMenuEsci_Click);
            //inserisco nell'item file la sottovoce
            mntItemMenuFile.DropDownItems.Add(mntItemMenuEsci);
            //inserisco i vari item
            MnsMenu.Items.Add(mntItemMenuFile);
            //creo il secondo item strumenti
            //item strumenti
            ToolStripMenuItem mntItemMenuStrumenti = new ToolStripMenuItem();
            mntItemMenuStrumenti.Text = "Strumenti";
            //item combo
            ToolStripComboBox MntItemMenuCitta = new ToolStripComboBox();
            string[] StrCitta = { "Roma", "Milano", "Firenze" };
            MntItemMenuCitta.Items.AddRange(StrCitta);
            //creo l'evento per la combo
            MntItemMenuCitta.TextChanged += new EventHandler(MntItemMenuCitta_TextChanged);
            //aggiungo l'item combo agli strumenti
            mntItemMenuStrumenti.DropDownItems.Add(MntItemMenuCitta);
            //item textboxt
            ToolStripTextBox MntItemMenuTrova = new ToolStripTextBox();
            MntItemMenuTrova.Text = "Trova";
            //creo l'evento per la voce trova
            MntItemMenuTrova.LostFocus += new EventHandler(MntItemMenuTrova_LostFocus);
            //aggiungo un item al menu strumenti
            mntItemMenuStrumenti.DropDownItems.Add(MntItemMenuTrova);
            //aggiungo l'item strumenti al menu
            MnsMenu.Items.Add(mntItemMenuStrumenti);
            this.Controls.Add(MnsMenu);
        }
        void MntItemMenuTrova_LostFocus(object sender, EventArgs e)
        {
            ToolStripTextBox MnuItemTrova = (ToolStripTextBox)sender;
            MessageBox.Show("Vuoi trovare la parola: " + MnuItemTrova.Text);
        }
        void MntItemMenuCitta_TextChanged(object sender, EventArgs e)
        {
            ToolStripComboBox MnuItemCitta = (ToolStripComboBox) sender;
            MessageBox.Show("La città selezionata è: " + MnuItemCitta.Text);
        }
        void mntItemMenuEsci_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        void mntItemMenuApri_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlgApri = new OpenFileDialog();
            dlgApri.ShowDialog();
        }

 

 

Per inserire i vari menu al controllo menustrip, il quale è il contenitore di tutte le voci di menu, dobbiamo utilizzare il metodo Add della proprietà items dell’oggetto menustrip. Fatto ciò dobbiamo aggiungere il controllo menustrip alla finestra, questo avviene tramite il metodo add della proprietà Controls, della nostra form.

Di seguito è riportato il codice delle suddette dichiarazioni:

VB.Net
        'aggiungo l'item strumenti al menu
        MnsMenu.Items.Add(mntItemMenuStrumenti)
      
        Me.Controls.Add(MnsMenu)
C#
//aggiungo l'item strumenti al menu
            MnsMenu.Items.Add(mntItemMenuStrumenti);
            this.Controls.Add(MnsMenu);

Conclusioni

In questo articolo sono stato illustrati i passi per creare un menu con determinate formattazioni, utilizzando la nuova classe per i menu ossia la menustrip.
 Come si è potuto notare questa  classe offre ampie potenzialità, che nella classe mainmenu non era posibile, solo tramite dovute implementanzioni a tale classe.
Tramite la parola download è possibile scaricare il sorgente utilizzato nell'articolo.

 

Download