- •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
works much like an array of Image objects, and can be thought of as such. Classes that use this construct specify an index into the list, designating which image they wish to display. Typically, a class that uses such a list provides an ImageList property to specify a list to use, and classes that display an image out of such lists provide an ImageIndex property to indicate which image to display.
In Visual Studio .NET, an ImageList can be associated with a Form graphically and assigned to one or more controls within that form using the Windows Forms Designer and the Properties windows. Visual Studio creates the list within the set of components for the Form, so that it is disposed when the application disposes of the Form via the Close or Dispose methods. We will look at the code generated for this purpose in a moment.
13.2.2CREATING AN IMAGE LIST
For the ToolBar object we created in our MainForm class, we need an ImageList containing the set of images required for our ToolBarButton objects. We will use some of the bitmaps and icons in the common image directory provided with Visual Studio. If you skipped chapter 12, or were simply not paying attention, this directory is typically “C:\Program Files\Microsoft Visual Studio .NET\Common7\Graphics.”
The following steps create an ImageList and associate the required image files with it.
Set the version number of the MyPhotos application to 13.2.
CREATE AN IMAGE LIST FOR OUR TOOLBAR
|
Action |
Result |
|
|
|
1 |
Associate an ImageList |
The new image list is shown in the component tray area |
|
component with the MainForm |
below the form. |
|
form in the MainForm.cs |
|
|
[Design] window. |
|
|
Note: Windows Forms compo- |
|
|
nents such as the ImageList |
|
|
class are available from the |
|
|
Toolbox window, just like Win- |
|
|
dows Forms controls. |
|
|
|
|
2 |
Set the (Name) property for the |
|
|
image list to imageListToolBar. |
|
|
|
|
3 |
Display the Image Collection |
A blank Image Collection Editor dialog box appears. This |
|
Editor window. |
dialog with all eight images added is shown in step 5. |
|
How-to |
|
|
Click the … button next to the |
|
|
Images item in the Properties |
|
|
window. |
|
|
|
|
IMAGE LISTS |
417 |
CREATE AN IMAGE LIST FOR OUR TOOLBAR (continued)
|
|
Action |
Result |
|
|
|
|
4 |
Add an image for creating a new |
The image appears as member 0 within the Image |
|
|
album to the collection. |
Collection Editor dialog. |
|
|
How-to |
|
|
|
a. Click the Add button. |
|
|
|
b. In the file dialog, locate the |
|
|
|
|
NEW.BMP file under the |
|
|
|
common image directory in |
|
|
|
the “bitmaps/OffCtlBr/Small/ |
|
|
|
Color” directory. |
|
|
c. Click the Open button to add |
|
|
|
|
the image. |
|
|
|
|
|
5 |
Similarly, add the following |
|
|
|
images files to the collection. |
|
|
|
• |
bitmaps/OffCtlBr/Small/Color/ |
|
|
|
OPEN.BMP |
|
|
• |
bitmaps/OffCtlBr/Small/Color/ |
|
|
|
SAVE.BMP |
|
|
• icons/arrows/ARW08LT.ICO |
|
|
|
• icons/arrows/ARW08RT.ICO |
|
|
|
• |
icons/Writing/BOOK02.ICO |
|
|
• |
icons/Traffic/TRFFC10C.ICO |
|
|
• |
icons/Traffic/TRFFC10A.ICO |
|
|
|
|
|
6 |
Click the OK button to save the |
The assigned images are stored in the image list. |
|
|
changes. |
|
|
|
|
|
|
This creates a collection of all the images we will need for our toolbar. An excerpt of the code generated by these changes is as follows.
. . .
namespace MyPhotos
{
. . .
public class MainForm : System.Windows.Forms.Form
{
. . .
private System.ComponentModel.IContainer components = null;
. . .
private System.Windows.Forms.ImageList imageListToolBar;
. . .
protected override void Dispose( bool disposing )
{
if( disposing )
{
418 |
CHAPTER 13 TOOLBARS AND TIPS |
if (components != null) |
|
|
|
|
|
{ |
b Dispose of the |
|
|
|
|
components.Dispose(); |
|
|
|
||
} |
|
components object |
|
|
|
} |
|
|
|
|
|
base.Dispose( disposing ); |
|
|
|
|
|
} |
|
|
|
|
|
. . . |
|
|
|
|
|
private void InitializeComponent() |
Create the image |
c |
|
||
|
|
|
|||
{ |
|
list within the |
|
|
|
. . . |
|
components container |
|
|
|
this.imageListToolBar |
|
|
|
|
|
|
|
|
|
|
|
= new System.Windows.Forms.ImageList(this.components); |
|
|
|
||
|
|
|
|||
. . . |
|
|
|
|
|
// |
|
Load the |
d |
||
// imageListToolBar |
|
||||
// |
|
image stream |
|
||
|
for the list |
|
|||
this.imageListToolBar.ColorDepth |
|
||||
|
|
|
|
=System.Windows.Forms.ColorDepth.Depth8Bit; this.imageListToolBar.ImageSize = new System.Drawing.Size(16, 16); this.imageListToolBar.ImageStream
=((System.Windows.Forms.ImageListStreamer)
(resources.GetObject("imageListToolBar.ImageStream")));
this.imageListToolBar.TransparentColor
= System.Drawing.Color.Transparent;
. . .
}
The annotated lines merit some additional discussion.
bThis line disposes of the components container, which in turn disposes of any components contained within this object. The controls on the form are contained within the Form object itself. As a result, the resources allocated to the controls in the form are disposed by the Form.Dispose method itself. This works for components such as the MainMenu and StatusBarPanel objects as well, since the menu is assigned to the form, and status bar panels are contained within status bar controls.
cThis line initializes an ImageList object and assigns it to the components container. This is required to ensure that the list is properly disposed of by the Form object’s Dispose method. If you create your own ImageList objects manually, be sure to dispose of the object when you are finished in order to free any Windows or file system resources assigned to the list.
dLike the bitmap files we created in the previous chapter, a ResourcesManager object is used to retrieve the stream of image data from a .resources file. This data is
retrieved as an ImageListStream object. This object is assigned to the ImageStream property and used internally by the ImageList class to manage and access the images in the collection.
IMAGE LISTS |
419 |
On this last point for our code, note that the MyPhotos project directory in the file system contains a MainForm.resx file that defines the binary form of the image stream for our list. This is very similar to how our bitmap images were defined for our Button objects in the previous chapter. An excerpt of this file follows. In addition to the definition of the image stream, note how the positioning of objects displayed in the component tray area of Visual Studio, such as the location of our
ToolBar object, are also stored in this file
<?xml version="1.0" encoding="utf-8"?> <root>
. . .
<data name="imageListToolBar.Location" type="System.Drawing.Point, System.Drawing,
Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <value>255, 17</value>
</data>
<data name="imageListToolBar.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuMzMw
MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT
eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA
. . .
</value>
. . .
</root>
This completes our discussion on image lists for now. Let’s get back to the ToolBar for our application and create the ToolBarButton components using the images we just assigned to our list.
13.3TOOLBAR BUTTONS
Now that we have some understanding of image lists, we can return to the topic of toolbar buttons. This section adds the ten buttons, both images and separators, we decided to place on our toolbar. The discussion is divided into two parts. First we will look at the most basic of styles, the push button. Then we’ll tackle the dropdown and toggle styles of ToolBarButton objects.
13.3.1ADDING A PUSH BUTTON
We have a toolbar and we have an image list, so let’s get to it. We will start with the push buttons related to the File menu, and later hook up these buttons to their corresponding menu item, after which we will create the buttons associated with the Next and Previous menu items.
420 |
CHAPTER 13 TOOLBARS AND TIPS |