- •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
18.2.2IMPLEMENTING THE SLIDE SHOW BEHAVIOR
Our user interface is ready to go. The following table details the steps required to implement this form to present a slide show to the user:
IMPLEMENT THE SLIDE SHOW BEHAVIOR
|
Action |
Result |
|
|
|
1 |
In the SlideShowForm.cs code |
using Manning.MyPhotoAlbum; |
|
window, Indicate that we will use |
|
|
the MyPhotoAlbum library in this file. |
|
|
|
|
2 |
Create two private fields in the class |
private PhotoAlbum _album; |
|
to hold the album and the current |
private int _albumPos; |
|
display position. |
|
|
|
|
3 |
Modify the constructor to accept a |
public SlideShowForm(PhotoAlbum album) |
|
PhotoAlbum object and initialize |
{ |
|
these private fields. |
// Required for Form Designer support |
|
InitializeComponent(); |
|
|
|
|
|
|
// Other initialization |
|
|
_album = album; |
|
|
_albumPos = 0; |
|
|
} |
|
|
|
4 |
Implement a SetInterval method |
protected void SetInterval() |
|
to calculate the timer interval based |
{ |
|
on the value in the text box control. |
int interval = 0; |
|
try |
|
|
|
|
|
Note: Since we do not prevent our |
{ |
|
text box from containing letters, we |
interval |
|
= Convert.ToInt32(txtInterval.Text); |
|
|
need to catch the possible excep- |
|
|
} |
|
|
tion here. |
catch |
|
|
{ |
|
|
// Reset interval value |
|
|
txtInterval.Text = "2"; |
|
|
interval = 2; |
|
|
} |
|
|
slideTimer.Interval = interval * 1000; |
|
|
} |
|
|
|
5 |
Override the OnLoad method to: |
protected override void OnLoad(EventArgs e) |
|
a. Set the timer interval. |
{ |
|
SetInterval(); |
|
|
b. Enable the timer. |
slideTimer.Enabled = true; |
|
c. Set the minimum and maximum |
trackSlide.Minimum = 0; |
|
value for the track bar based on |
trackSlide.Maximum = _album.Count - 1; |
|
the number of photos in the |
base.OnLoad(e); |
|
album. |
} |
|
|
|
|
|
|
TIMERS |
615 |
IMPLEMENT THE SLIDE SHOW BEHAVIOR (continued)
|
Action |
Result |
|
|
|
6 |
Add a Paint event handler for the |
private void pboxSlide_Paint |
|
PictureBox control to do the |
(object sender, |
|
following: |
System.Windows.Forms.PaintEventArgs e) |
|
{ |
|
|
|
|
|
a. If the current position is out of |
if (_albumPos >= _album.Count) |
|
range, simply return. |
return; |
|
|
|
|
b. Load the current Photograph. |
Photograph photo = _album[_albumPos]; |
|
c. Display the caption in the title bar. |
if (photo != null) |
|
{ |
|
|
d. Preserve the aspect ratio when |
|
|
this.Text |
|
|
drawing the image into the |
= String.Format("{0} ({1:#}/{2:#})", |
|
window. |
photo.Caption, |
|
_albumPos + 1, _album.Count); |
|
|
|
|
|
|
e.Graphics.DrawImage(photo.Image, |
|
|
photo.ScaleToFit( |
|
|
pboxSlide.ClientRectangle)); |
|
|
} |
|
|
else |
|
|
e.Graphics.Clear(SystemColors.Control); |
|
|
} |
|
|
|
7 |
Add a Tick event handler for the |
private void slideTimer_Tick |
|
slideTimer component. |
(object sender, System.EventArgs e) |
|
How-to |
{ |
|
|
|
|
This is the default event for this |
|
|
component, so simply double-click |
|
|
the timer in the component tray. |
|
|
|
|
8 |
In this handler, increment the current |
_albumPos ++; |
|
album position. |
|
|
|
|
9 |
If the position is passed the end of |
if (_albumPos > _album.Count) |
|
the album, reset the slide show as |
{ |
|
follows: |
btnStop.Text = "&Start"; |
|
_albumPos = 0; |
|
|
|
|
|
a. Modify the Stop button text to be |
trackSlide.Value = 0; |
|
Start. |
pboxSlide.Invalidate(); |
|
slideTimer.Enabled = false; |
|
|
b. Reset the track bar value to zero. |
|
|
} |
|
|
c. Invalidate the picture box to draw |
|
|
the initial photograph. |
|
|
d. Disable the timer. |
|
|
|
|
10 |
If the position is at the end of the |
else if (_albumPos == _album.Count) |
|
album, set the title bar to indicate |
{ |
|
the slide show is finished. |
this.Text = "Finished"; |
|
} |
|
|
|
|
|
|
|
11 |
Otherwise, for a valid album index: |
else |
|
a. Invalidate the picture box to draw |
{ |
|
pboxSlide.Invalidate(); |
|
|
the next image. |
trackSlide.Value = _albumPos; |
|
b. Set the track bar value to the cur- |
} |
|
|
|
|
rent position. |
|
|
|
|
12 |
Reassign the interval value to pick up |
// Reset the interval |
|
any changes made by the user. |
SetInterval(); |
|
|
} |
|
|
|
616 |
CHAPTER 18 ODDS AND ENDS .NET |
IMPLEMENT THE SLIDE SHOW BEHAVIOR (continued)
|
Action |
Result |
|
|
|
13 |
Add a Click event handler for the |
private void btnClose_Click |
|
Close button to close the form. |
(object sender, System.EventArgs e) |
|
|
{ |
|
|
this.Close(); |
|
|
} |
|
|
|
14 |
Add a Click event handler for the |
private void btnStop_Click |
|
Stop button. |
(object sender, System.EventArgs e) |
|
|
{ |
|
|
|
15 |
If the current Text value is Stop, |
if (btnStop.Text == "&Stop") |
|
stop the timer and set the button |
{ |
|
text to Resume. |
// Stop |
|
slideTimer.Stop(); |
|
|
|
|
|
Note: While our Stop button has |
btnStop.Text = "Re&sume"; |
|
three different display strings, we |
} |
|
|
|
|
preserve the keyboard access key |
|
|
of Alt+S in all three values. |
|
|
|
|
16 |
For other text values, start the timer |
else |
|
and set the button text to Stop. |
{ |
|
|
// Resume or Start |
|
|
slideTimer.Start(); |
|
|
btnStop.Text = "&Stop"; |
|
|
} |
|
|
} |
|
|
|
17 |
Add a Scroll event handler for the |
private void trackSlide_Scroll |
|
TrackBar control. |
(object sender, System.EventArgs e) |
|
Note: This is the default event for |
{ |
|
|
|
|
the track bar control, and occurs |
|
|
when the user manually adjusts the |
|
|
slider position. |
|
|
|
|
18 |
In this handler: |
_albumPos = trackSlide.Value; |
|
a. Set the album position to the new |
pboxSlide.Invalidate(); |
|
} |
|
|
value. |
|
|
b. Invalidate the picture box to draw |
|
|
the selected photo. |
|
|
|
|
19 |
Add a Resize event handler for the |
private void pboxSlide_Resize |
|
PictureBox control to invalidate the |
(object sender, System.EventArgs e) |
|
control and redraw the image. |
{ |
|
pboxSlide.Invalidate(); |
|
|
|
|
|
|
} |
|
|
|
20 |
Back in the MainForm class, add a |
private void menuSlideShow_Click |
|
Click event handler for the Slide |
(object sender, System.EventArgs e) |
|
Show menu to create and display a |
{ |
|
using (SlideShowForm f |
|
|
SlideShowForm dialog. |
|
|
= new SlideShowForm(_album)) |
|
|
|
{ |
|
|
// Display slide show as modal dialog |
|
|
f.ShowDialog(); |
|
|
} |
|
|
} |
|
|
|
TIMERS |
617 |