Menus
Menus are one of the primary means of selecting a program's available options. They're similar to controls, but their function is specialized to invoking selected features of a program. Table 16.2 shows how to create and use Windows Forms Menus.
Table 16.2 Windows Forms Menu Controls
Menu Control |
What It Does |
ContextMenu |
Menus that are invoked by right-clicking a control. |
MainMenu |
Resides at the top of a form, below its title bar. It is the root menu of an entire menu hierarchy. |
MenuItem |
Sub-menus of a MainMenu and other MenuItems. They form the branches and nodes of the menu hierarchy. MenuItems are used to invoke some capability of a program. |
As a part of any standard GUI implementations, Menus are very straightforward and easy to implement. They have a hierarchical structure that makes as much sense in development as in use. Listing 16.11 shows an example of how to implement menus. It's an enhancement of the CiteManagerForm class from previous sections.
Listing 16.11 Cite Manager with Menus: CiteManagerFormMenus.cs
using System; using System.Drawing; using System.ComponentModel; using System.Windows.Forms; public class CiteManagerForm : Form { private SiteManager citeMgr; private Container components; private Button addButton; private Button deleteButton; private Button modifyButton; private Button viewButton; private Label selectLabel; private MainMenu citeMgrMenu; private MenuItem fileMenu; private MenuItem fileOpenMenu; private MenuItem fileSaveMenu; private MenuItem fileSeparatorMenu; private MenuItem fileExitMenu; public CiteManagerForm() { InitializeComponent(); citeMgr = new SiteManager(); } public override void Dispose() { base.Dispose(); components.Dispose(); } private void InitializeComponent() { components = new Container(); addButton = new Button(); deleteButton = new Button(); modifyButton = new Button(); viewButton = new Button(); selectLabel = new Label(); citeMgrMenu = new MainMenu(); fileMenu = new MenuItem(); fileOpenMenu = new MenuItem(); fileSaveMenu = new MenuItem(); fileSeparatorMenu = new MenuItem(); fileExitMenu = new MenuItem(); addButton.Text = "Add"; addButton.Click += new EventHandler (addButton_Click); addButton.Location = new Point(94, 80); addButton.Size = new Size(75, 23); addButton.TabIndex = 0; deleteButton.Text = "Delete"; deleteButton.Click += new EventHandler(deleteButton_Click); deleteButton.Location = new Point(94, 128); deleteButton.Size = new Size(75, 23); deleteButton.TabIndex = 1; modifyButton.Text = "Modify"; modifyButton.Click += new EventHandler(modifyButton_Click); modifyButton.Location = new Point(94, 176); modifyButton.Size = new Size(75, 23); modifyButton.TabIndex = 2; viewButton.Text = "View"; viewButton.Click += new EventHandler(viewButton_Click); viewButton.Location = new Point(94, 224); viewButton.Size = new Size(75, 23); viewButton.TabIndex = 3; selectLabel.Text = "Please Make a Selection:"; selectLabel.Font = new Font("Lucida Console", 12, FontStyle.Italic); selectLabel.Location = new Point(10, 32); selectLabel.Size = new Size(246, 18); selectLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; selectLabel.AutoSize = true; selectLabel.TabIndex = 4; fileMenu.Text = "&File"; fileMenu.Index = 0; fileOpenMenu.Text = "&Open"; fileOpenMenu.Click += new EventHandler (fileOpenMenu_Click); fileOpenMenu.Index = 0; fileSaveMenu.Text = "&Save"; fileSaveMenu.Click += new EventHandler (fileSaveMenu_Click); fileSaveMenu.Index = 1; fileSeparatorMenu.Text = "-"; fileSeparatorMenu.Index = 2; fileExitMenu.Text = "E&xit"; fileExitMenu.Click += new EventHandler (fileExitMenu_Click); fileExitMenu.Index = 3; fileMenu.MenuItems.Add(fileOpenMenu); fileMenu.MenuItems.Add(fileSaveMenu); fileMenu.MenuItems.Add(fileSeparatorMenu); fileMenu.MenuItems.Add(fileExitMenu); citeMgrMenu.MenuItems.Add(fileMenu); Menu = citeMgrMenu; Text = "Cite Manager"; ClientSize = new Size (264, 273); Controls.Add(selectLabel); Controls.Add(modifyButton); Controls.Add(viewButton); Controls.Add(deleteButton); Controls.Add(addButton); } protected void deleteButton_Click (object sender, System.EventArgs e) { DeleteForm df = new DeleteForm(citeMgr); df.ShowDialog(this); } protected void modifyButton_Click (object sender, System.EventArgs e) { ModifyForm mf = new ModifyForm(citeMgr); mf.ShowDialog(this); } protected void viewButton_Click (object sender, System.EventArgs e) { ViewForm vf = new ViewForm(citeMgr); vf.ShowDialog(this); } protected void addButton_Click (object sender, System.EventArgs e) { AddForm af = new AddForm(); DialogResult dlgRes = af.ShowDialog(this); switch (dlgRes) { case DialogResult.OK: citeMgr.AddSite( af.sitenameTextbox.Text, af.addressTextbox.Text, af.descriptionTextbox.Text); break; case DialogResult.Cancel: // do nothing break; default: break; } } protected void fileOpenMenu_Click (object sender, System.EventArgs e) { MessageBox.Show("File/Open Clicked", "Menu Selection", MessageBoxButtons.OK, MessageBoxIcon.Information); } protected void fileSaveMenu_Click (object sender, System.EventArgs e) { MessageBox.Show("File/Save Clicked", "Menu Selection", MessageBoxButtons.OK, MessageBoxIcon.Information); } protected void fileExitMenu_Click (object sender, System.EventArgs e) { DialogResult dlgRes = MessageBox.Show( "Are You Sure?", "Program Exiting", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (dlgRes == DialogResult.OK) Close(); } public static void Main(string[] args) { Application.Run(new CiteManagerForm()); } }
Listing 16.11 can be compiled with previous listings by using the command line from Listing 16.12.
Listing 16.12 Command Line for the Cite Manager Program
csc /out:citemgr.exe /r:System.Windows.Forms.DLL _/r:System.Drawing.DLL CiteManagerForm.cs _AddForm.cs DeleteForm.cs ModifyForm.cs _ViewForm.cs SiteManager.cs WebSites.cs
Listing 16.11 shows how to implement Windows Forms menus. Following the hierarchical organization of menus, the citeMgrMenu is defined as a MainMenu. The rest of the menus are defined as MenuItems.
Each MenuItem has a Text and Index property. The Text property sets the text that appears on screen. The & character in front of a letter in the text makes the following character a shortcut for the menu item. In the case of the File menu, the user can press the Alt+F keys to open the menu. The Index property is a zero-based position identifier for the menu. In this case, the first menu item in the File menu is the Open menu item at index 0. The last is the Exit menu item at index 3.
Menu items are tied to actions the same as Buttons. Just add an EventHandler delegate with an event handler method parameter to the menu item Click event. Each of the Open, Save, and Exit menu items has an event handler that invokes a Windows Forms MessageBox. The MessageBox has three parameters. The first is the text to be displayed in the MessageBox. The second is the text that goes into the MessageBox title bar. The second controls decoration of the MessageBox. The Open and Save MessageBox calls use the MessagBox.IconInformation constant. This is what shows the information icon when the MessageBox appears on screen. A MessageBox has an OK button by default. The Exit event handler method is a bit different. It has a couple OR'd constants as its third MessageBox parameter. This causes it to show a Warning icon and both an OK and a Cancel button. When the user clicks the OK button, the program calls the form's Close() method, which quits the application.
A menu hierarchy is built from the bottom up. The example shows the Open, Save, Separator, and Exit menu items being added to the File menu's MenuItems collection. The File menu is added to the MainMenu, citeMgrMenu. Then the form's Menu property is set with the citeMgrMenu.