Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# ПІДРУЧНИКИ / c# / Manning - Windows.forms.programming.with.c#.pdf
Скачиваний:
108
Добавлен:
12.02.2016
Размер:
14.98 Mб
Скачать

Once this is done, we will look at implementing any changes required to support these menus.

The following table details the steps required:

ASSIGN THE TYPE AND ORDER FOR OUR FILE MENUS

 

 

 

 

Action

 

 

 

 

Result

 

 

 

 

 

 

 

 

 

 

 

1

 

In the ParentForm.cs [Design]

 

 

 

window, add an Open menu to the

 

 

 

File menu just after the existing New

 

 

 

menu.

 

 

 

 

 

 

 

 

 

 

 

 

Settings

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Property

 

 

Value

 

 

 

 

(Name)

 

menuOpen

 

 

 

 

Shortcut

 

 

CtrlO

 

 

 

 

Text

 

 

&Open

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

Update the merge settings for the

 

 

 

items in the File menu.

 

 

 

 

 

 

 

 

 

Settings

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Menu

MergeType

MergeOrder

 

 

 

 

New

Replace

 

0

 

 

 

 

 

 

 

Open

Replace

 

1

 

 

 

 

 

 

separator

Remove

 

0

 

 

 

 

 

 

 

Exit

Add

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

In the File menu for the MainForm.cs

 

 

 

[Design] window, update the merge

 

 

 

settings for the items in this menu.

 

 

 

 

 

Settings

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Menu

MergeType

 

MergeOrder

 

 

 

 

New

Remove

 

0

 

 

 

 

 

 

 

Open

Remove

 

1

 

 

 

 

 

 

separator

Add

 

3

 

 

 

 

 

 

 

Save

Add

 

4

 

 

 

 

 

 

Save As

Add

 

5

 

 

 

 

 

 

separator

Add

 

6

 

 

 

 

 

 

 

Exit

Add

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

The key points here are the fact that the New and Open menus in the ParentForm class replace those in the MainForm class, and the merge order for each menu must match the desired position we discussed earlier. One other interesting point is the reuse of the Exit menu in the MainForm class for the Close menu in the merged menu. This makes sense, although we still need to rename the menu text to read

MERGED MENUS

539

“Close” rather than “Exit.” We will do this in a way that continues to preserve the SDI application from part 2.

CHANGE THE EXIT MENU TEXT WHEN RUNNING AS AN MDI CHILD FORM

 

Action

Result

 

 

 

4

Override the OnLoad method in

protected override void OnLoad(EventArgs e)

 

the MainForm.cs code window.

{

 

 

 

5

If the form is an MDI child

if (IsMdiChild)

 

window, then modify the Exit

menuExit.Text = "&Close";

 

menu to appear as a Close

base.OnLoad(e);

 

menu.

 

}

 

How-to

 

 

Use the IsMdiChild property.

 

 

 

 

This change ensures that the Exit menu displays “Close” when the MainForm object is created as an MDI child window. Otherwise, the default setting of “Exit” will be used.

Compile and run the application to verify that our changes produce the appropriate menu structure. Create a new MDI child window and display the File menu. Your application should appear as in figure 16.5. Note how all the menus are now in the desired order, including the separator menus. Also note that the Exit menu from the MainForm class is reincarnated as the Close menu in the MDI application.

Figure 16.5 The merged File menu here gives no indication that different menu items are processed in different classes.

540

CHAPTER 16 MULTIPLE DOCUMENT INTERFACES

Of course, the Open menu is not yet implemented for our ParentForm class. Also note that the Toolbar control in our child window still provides access to the now hidden New and Open menus in the MainForm class.

We will deal with our toolbar shortly. First, let’s discuss our new Open menu.

16.3.3OPENING A CHILD FORM

The Open menu in the parent form should work much like the now hidden Open

menu for the MainForm class. The handler for this menu should display an OpenFileDialog and create a new child window containing the selected album. To create the MainForm instance, we will create a new constructor that accepts an album file name with which to initialize the window.

The code required here is nothing new to us, so let’s get to it.

IMPLEMENT HANDLER FOR OPEN MENU IN PARENT FORM

 

ACTION

RESULT

 

 

 

1

Add a using statement for

using Manning.MyPhotoAlbum;

 

our library at the start of

 

 

the ParentForm.cs code

 

 

window.

 

 

 

 

2

Add a Click handler for

private void menuOpen_Click

 

the Open menu in the

(object sender, System.EventArgs e)

 

ParentForm.cs [Design]

{

 

 

 

window.

 

 

 

 

3

Implement this handler to

// Allow user to select a new album

 

display an OpenFile-

using (OpenFileDialog dlg = new OpenFileDialog())

 

Dialog instance from

{

 

dlg.Title = "Open Album";

 

which to select an album.

 

dlg.Filter = "abm files (*.abm)|"

 

 

+ "*.abm|All files (*.*)|*.*";

 

 

dlg.InitialDirectory = PhotoAlbum.DefaultDir;

 

 

dlg.RestoreDirectory = true;

 

 

if (dlg.ShowDialog() == DialogResult.OK)

 

 

{

 

 

 

4

If an album is selected, try

try

 

to open the file in a new

{

 

window.

// Open new child window for the album

 

MainForm form = new MainForm(dlg.FileName);

 

 

 

How-to

form.MdiParent = this;

 

Use a not-yet-implemented

form.Show();

 

}

 

constructor that accepts an

 

 

 

album file.

 

 

 

 

MERGED MENUS

541

IMPLEMENT HANDLER FOR OPEN MENU IN PARENT FORM (continued)

 

ACTION

RESULT

 

 

 

5

If an error occurs creating

catch (Exception ex)

 

the child window, display

{

 

an error message to the

MessageBox.Show(this,

 

"Unable to open file " + dlg.FileName

 

user.

 

+ "\n (" + ex.Message + ")",

 

 

"Open Album Error",

 

 

MessageBoxButtons.OK,

 

 

MessageBoxIcon.Error);

 

 

}

 

 

}

 

 

}

 

 

}

 

 

 

The code displays an open file dialog and creates a child window using the selected album file. This code requires a new constructor for the MainForm class, namely one that accepts the file name of a photo album.

In this new constructor, we would like to make use of the constructor code already present in the existing constructor. We can do this in C# by simply invoking the default constructor with the this keyword. The following table illustrates this syntax, and the changes required for our new constructor.

CREATE A MAINFORM CONSTRUCTOR THAT ACCEPTS AN ALBUM FILE

Action

Result

6In the MainForm.cs file, create a public MainForm(string albumFile) new constructor that accepts

the name of an album file.

7

Invoke the default constructor

: this()

 

within our new constructor.

{

 

 

 

8

Within the constructor, create a

_album = new PhotoAlbum();

 

PhotoAlbum for the given file.

_album.Open(albumFile);

 

Note: If a file cannot be opened

SetTitleBar();

 

}

 

as an album, this will throw an

 

 

exception.

 

These changes permit the ParentForm class to create a new child window containing an open album. Compile and run the application to verify that this works as expected. The File menu from our two classes is now fully merged, and all menus are fully implemented.

As can be seen from this discussion, the ability to merge menus provides a powerful mechanism for controlling the menu bar in MDI applications. They permit the exact placement of menu items, and control over which class, the parent or child, will process each item. While we only merged a single menu here, you may find in your

542

CHAPTER 16 MULTIPLE DOCUMENT INTERFACES

Соседние файлы в папке c#