giovedì 2 ottobre 2008

Il controllo MenuStrip in Net 3.5 (VB.Net e C#)

Riporto un articolo scritto per il sito iprogrammatori http://www.iprogrammatori.it/articoli/programmazione/art_il-controllo-menustrip-in-net-35_125.aspx in cui illustro la creazione di un menustrip in .NEt 3.5







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

?>

1 commento:

sk ha detto...

Esiste la possibilità di strutturare il menù in funzione di un file XML sfruttando il Binding ? Similmente a come si fa in ASP.NET. Ciao