- •brief contents
- •about this book
- •The Windows Forms namespace
- •Part 1: Hello Windows Forms
- •Part 2: Basic Windows Forms
- •Part 3: Advanced Windows Forms
- •Who should read this book?
- •Conventions
- •Action
- •Result
- •Source code downloads
- •Author online
- •acknowledgments
- •about .NET
- •Casting the .NET
- •Windows Forms overview
- •about the cover illustration
- •Hello Windows Forms
- •1.1 Programming in C#
- •1.1.1 Namespaces and classes
- •1.1.2 Constructors and methods
- •1.1.3 C# types
- •1.1.4 The entry point
- •1.1.5 The Application class
- •1.1.6 Program execution
- •1.2 Adding controls
- •1.2.1 Shortcuts and fully qualified names
- •1.2.2 Fields and properties
- •1.2.3 The Controls property
- •1.3 Loading files
- •1.3.1 Events
- •1.3.2 The OpenFileDialog class
- •1.3.3 Bitmap images
- •1.4 Resizing forms
- •1.4.1 Desktop layout properties
- •1.4.2 The Anchor property
- •1.4.3 The Dock property
- •1.5 Recap
- •2.1 Programming with Visual Studio .NET
- •2.1.1 Creating a project
- •Action
- •Result
- •2.1.2 Executing a program
- •Action
- •Result
- •2.1.3 Viewing the source code
- •View the code generated by Visual Studio .NET
- •Action
- •Result
- •2.2 Adding controls
- •2.2.1 The AssemblyInfo file
- •Action
- •Results
- •2.2.2 Renaming a form
- •Action
- •Result
- •2.2.3 The Toolbox window
- •Action
- •Result
- •2.3 Loading files
- •2.3.1 Event handlers in Visual Studio .NET
- •Action
- •Result
- •2.3.2 Exception handling
- •Action
- •Result
- •Action
- •Results and Comments
- •2.4 Resizing forms
- •2.4.1 Assign the Anchor property
- •Action
- •Result
- •2.4.2 Assign the MinimumSize property
- •Action
- •Result
- •2.5 Recap
- •Basic Windows Forms
- •Menus
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •3.3 Click events
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •3.5 Context menus
- •Action
- •Result
- •Action
- •Result
- •3.6 Recap
- •Status bars
- •4.1 The Control class
- •4.2 The StatusBar class
- •Action
- •Result
- •Action
- •Result
- •4.3.1 Adding panels to a status bar
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •4.5 Recap
- •Reusable libraries
- •5.1 C# classes and interfaces
- •5.2 Class libraries
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •5.3 Interfaces revisited
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •5.4 Robustness issues
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Common file dialogs
- •Action
- •Results
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •6.3 Paint events
- •Action
- •Result
- •Action
- •Result
- •6.4 Context menus revisited
- •Action
- •Result
- •Action
- •Result
- •6.5 Files and paths
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •6.6 Save file dialogs
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •6.7 Open file dialogs
- •Action
- •Result
- •Action
- •Result
- •6.8 Recap
- •Drawing and scrolling
- •7.1 Form class hierarchy
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •7.4 Panels
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Dialog boxes
- •8.1 Message boxes
- •Action
- •Result
- •Action
- •Result
- •8.1.4 Creating A YesNoCancel dialog
- •Action
- •Result
- •Action
- •Result
- •8.2 The Form.Close method
- •8.2.1 The relationship between Close and Dispose
- •Action
- •Result
- •8.3 Modal dialog boxes
- •Action
- •Result
- •Action
- •Result
- •8.3.2 Preserving caption values
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Basic controls
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •9.1.2 Creating a derived form
- •Action
- •Result
- •9.2 Labels and text boxes
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •9.3.6 Adding AlbumEditDlg to our main form
- •Action
- •Result
- •Action
- •Result
- •9.4 Recap
- •List controls
- •10.1 List boxes
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •10.2 Multiselection list boxes
- •10.2.1 Enabling multiple selection
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •10.3 Combo boxes
- •Action
- •Result
- •Action
- •Result
- •10.4 Combo box edits
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •10.5 Owner-drawn lists
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •More controls
- •Action
- •Result
- •Action
- •Result
- •11.2 Tab pages
- •Action
- •Result
- •Action
- •Result
- •11.3.1 Dates and times
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •11.5 Recap
- •A .NET assortment
- •12.1 Keyboard events
- •Action
- •Result
- •Action
- •Result
- •12.2 Mouse events
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •12.3 Image buttons
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •12.4 Icons
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •12.5 Recap
- •Toolbars and tips
- •13.1 Toolbars
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •13.4.2 Creating tool tips
- •Action
- •Result
- •Action
- •Result
- •Advanced Windows Forms
- •List views
- •14.2 The ListView class
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •14.2.3 Populating a ListView
- •Action
- •Result
- •Action
- •14.3 ListView columns
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •14.6 Recap
- •Tree views
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •15.3 Dynamic tree nodes
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •15.4 Node selection
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •15.5 Fun with tree views
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Multiple document interfaces
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •16.3 Merged menus
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •16.4 MDI children
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •16.5 MDI child window management
- •Action
- •Result
- •Action
- •Result
- •16.6 Recap
- •Data binding
- •17.1 Data grids
- •Action
- •Result
- •Action
- •Result
- •17.2 Data grid customization
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Odds and ends .NET
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •18.2 Timers
- •Action
- •Result
- •Action
- •Result
- •18.3 Drag and drop
- •Action
- •Result
- •Action
- •Result
- •18.4 ActiveX controls
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •18.5 Recap
- •C# primer
- •A.1 C# programs
- •A.1.1 Assemblies
- •A.1.2 Namespaces
- •A.2 Types
- •A.2.1 Classes
- •A.2.2 Structures
- •A.2.3 Interfaces
- •A.2.4 Enumerations
- •A.2.5 Delegates
- •A.3 Language elements
- •A.3.1 Built-in types
- •A.3.2 Operators
- •A.3.3 Keywords
- •A.4 Special features
- •A.4.1 Exceptions
- •A.4.2 Arrays
- •A.4.3 Main
- •A.4.4 Boxing
- •A.4.5 Documentation
- •.NET namespaces
- •B.1 System.Collections
- •B.2 System.ComponentModel
- •B.3 System.Data
- •B.4 System.Drawing
- •B.5 System.Globalization
- •B.6 System.IO
- •B.7 System.Net
- •B.8 System.Reflection
- •B.9 System.Resources
- •B.10 System.Security
- •B.11 System.Threading
- •B.12 System.Web
- •B.13 System.Windows.Forms
- •B.14 System.XML
- •Visual index
- •C.1 Objects
- •C.2 Marshal by reference objects
- •C.3 Components
- •C.4 Common dialogs
- •C.7 Event data
- •C.8 Enumerations
- •For more information
- •bibliography
- •Symbols
- •Index
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 |
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 |