Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Manning - Windows Forms Programming With CSharp.pdf
Скачиваний:
72
Добавлен:
24.05.2014
Размер:
14.98 Mб
Скачать

IMPLEMENT A CLICK HANDLER FOR THE CAPTION MENU

 

Action

 

Result

 

 

 

6

Add a Click event handler for the

protected void menuCaption_Click

 

Caption menu.

(object sender, System.EventArgs e)

 

 

{

 

 

 

 

7

Get the current photograph.

Photograph photo = _album.CurrentPhoto;

 

 

if (photo == null)

 

 

return;

// no current photo

 

 

Note: Since the user can only click the Caption

 

 

menu if an image is displayed, the value of photo

 

 

should never be null. It never hurts to be safe,

 

 

though.

 

 

 

 

8

Use the CaptionDlg object to

using (CaptionDlg dlg = new CaptionDlg())

 

modify the caption.

{

 

 

 

Note: Congratulations, you have just created a

 

 

Form. The using statement will clean up the dia-

 

 

log’s resources when we are finished.

 

 

 

9

Initialize the dialog with the settings

dlg.ImageLabel = photo.FileName;

 

from the current Photograph.

dlg.Caption = photo.Caption;

 

 

 

10

Display the dialog.

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

 

 

{

 

 

 

 

11

If the user clicks OK, modify the

photo.Caption = dlg.Caption;

 

Photograph object to use the new

this._bAlbumChanged = true;

 

settings.

 

 

 

 

 

12

Also update the caption text in the

sbpnlFileName.Text = photo.Caption;

 

status bar as well.

statusBar1.Invalidate();

 

 

}

 

 

 

}

 

 

 

}

 

 

 

 

 

If you are familiar with the MFC library, this code will be reminiscent of how you might use the CDialog class to perform a similar task. One major difference is how the object is created and destroyed. In MFC you would create the dialog on the stack and rely on C++ to destroy the object by calling its destructor when the stack is cleaned up. In C#, of course, the memory for our dialog is cleaned up by the garbage collector. To ensure that its nonmemory resources are cleaned up immediately, we create the dialog within a using statement.

The dialog does not appear to the user until the ShowDialog method is called, at which point the entire application waits until the user clicks the OK or the Cancel button.

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

{

photo.Caption = dlg.Caption; this._bAlbumChanged = true; sbpnlFileName.Text = photo.Caption; statusBar1.Invalidate();

}

MODAL DIALOG BOXES

251

Figure 8.6
Our modeless dialog will show the position in image coordinates and RGB color of the pixel indicated by the current location of the cursor.

If the user clicks the OK button, DialogResult.OK is returned and any new caption he or she entered is stored in the photograph and propagated to the status bar. Note how we set _bAlbumChanged to true to indicate the album has changed. If the user clicks the Cancel button, DialogResult.Cancel is returned and the photograph’s caption will not be altered.

Our dialog is now complete. It is displayed via the Caption menu and initialized with the current image file and caption settings. The user can modify the caption and click OK to save it. The new caption appears on the status bar and is stored in the album file when the album is saved.

We will see more modal dialogs as we continue our trip through Windows Forms. Before we end the chapter, let’s also discuss modeless dialogs.

8.4MODELESS DIALOGS

In the previous section we created a dialog box to allow the user to edit the caption for a photograph. Modal dialog boxes tend to be in and out. You open it, you do something, you close it. Modeless dialog boxes tend to show some information relevant to the program. In a stock analysis program, for example, you might have a stock ticker window that runs independently of the program. This would be a modeless, or nonmodal, dialog and would update continuously with stock information, perhaps related to a displayed portfolio or to what the user is viewing in the main application window.

In this section we will create a modeless dialog to display the location of the mouse pointer within the image window, and the color of the image at this location. This information will update continuously as the location of the mouse pointer changes, using the dialog in figure 8.6. As you can see in the figure, the pixel position of the mouse pointer within the image is shown as an X and Y coordinate, along with the color in RGB or red, blue, and green, coordinates. This par-

ticular figure indicates that the mouse pointer is over the image at pixel (100, 100) of the image, and the current color at that pixel has an RGB value of (203, 183, 185).

As for our caption dialog, we will need to make sure our three layers can support this dialog.

Data layer. The position and color of the current pixel is based on the location of the mouse pointer within the displayed bitmap. Since this information is already available, no changes are necessary here.

Presentation layer. As before, we will need a Form-based class to display the dialog. Since we are showing information about the current pixel, we will call this class PixelDlg and store it in the file PixelDlg.cs.

252

CHAPTER 8 DIALOG BOXES

Application layer. Our application will again tie the data and presentation together. To do this, we will create a new menu item under the View menu called “Pixel Data.”

Since no changes are required to the data layer in this case, we will begin with the presentation layer

8.4.1CREATING THE PIXELDLG FORM

The creation of a dialog is much the same whether it is a modal or modeless dialog. First you create a new Form class for the dialog, update the property settings, lay out the controls on the form, and finally add code to set or process the controls as required.

So let’s begin by creating the dialog.

Set the version number of the MyPhotos application to 8.4.

CREATE THE PIXELDLG CLASS

 

 

Action

Result

 

 

 

 

 

 

1

Add a new form to the MyPhotos project

The new class is added to the MyPhotos

 

with the name “PixelDlg.”

project, and a design window for the class is

 

 

 

 

 

displayed.

 

 

 

 

 

 

2

Set the properties for the form as indicated.

 

 

 

Settings

 

 

 

 

 

 

 

 

 

Property

Value

 

 

 

FormBorderStyle

FixedSingle

 

 

 

MaximizeBox

false

 

 

 

MinimizeBox

false

 

 

 

Size

150, 230

 

 

 

 

Text

Pixel Values

 

 

Note: The border style FixedSingle used

 

 

here is similar to FixedDialog, except that

 

 

the control box appears on the form. Since

 

 

this will be a modeless dialog, it also seems

 

 

appropriate to use the default setting of

 

 

true for the ShowInTaskbar property.

 

 

 

 

 

 

 

MODELESS DIALOGS

253

 

CREATE THE PIXELDLG CLASS

(continued)

 

 

 

 

 

Action

 

Result

 

 

 

 

3

Create and arrange the five Label objects on

 

 

 

the left side of the dialog.

 

 

 

How-to

 

 

 

a. Drag Label objects from the Toolbox

 

 

 

onto the form. Note that you can repeat-

 

 

 

edly double-click the Label entry in the

 

 

 

Toolbox to add successive Label con-

 

 

 

trols to the form.

 

 

 

b. Set the TextAlign properties for these

 

 

 

labels to TopRight.

 

 

 

c. Set the Text property for these labels to

 

 

 

X, Y, Red, Green, and Blue, respectively.

 

 

 

Note: You can set the TextAlign property

 

 

 

for all controls at once using the following

 

 

 

technique:

 

 

 

a. Using the mouse, click the form and drag

 

 

 

a box around all five controls. The Proper-

 

 

 

ties window now displays the common

 

 

 

properties for the five selected controls.

 

 

 

b. Set the TextAlign property to the

 

 

 

desired value.

 

 

 

 

 

 

4

Create and arrange the five Label objects on

 

 

 

the right side of the dialog.

 

 

 

How-to

 

 

 

a. Place the new Label objects on the form.

 

 

 

b. Set the BorderStyle property for each

 

 

 

label to Fixed3D.

 

 

 

c. Set the (Name) property to lblXVal,

 

 

 

lblYVal, lblRedVal, lblGreenVal, and

 

 

 

lblBlueVal, respectively.

 

 

 

 

 

 

254

CHAPTER 8 DIALOG BOXES