Chapter 1: Creating Usable Interfaces
Figure 1-1: The archetypal command-line interface
Figure 1-2: The command line in Visual Studio .NET
Figure 1-3: A genuinely useful wizard
Figure 1-4: A metaphor-based calendar and organizer
Figure 1-5: Explorer-like user interface
Figure 1-6: Two approaches to an audio recorder
Chapter 2: Designing with Classes and Tiers
Figure 2-1: A sample form
Figure 2-2: Control containment for a sample form
Figure 2-3: Two ways to interact with controls
Figure 2-4: Ordinary forms and visual inheritance
Figure 2-5: Using form and application switchboards
Figure 2-6: Three-tier design
Figure 2-7: An intelligent TreeView database browser
Chapter 3: Control Class Basics
Figure 3-1: Control hierarchy
Figure 3-2: A medley of different controls
Figure 3-3: Control measurements
Figure 3-4: A color changing form
Figure 3-5: A simple font viewer
Figure 3-6: Focused buttons
Figure 3-7: The Visual Studio .NET tab order tool
Figure 3-8: An event tracker
Figure 3-9: Common control picture support
Figure 4-1: The component tray
Figure 4-2: Adding a COM reference
Figure 4-3: AxHost interaction
Figure 4-4: Two LinkLabel examples
Figure 4-5: The built-in TextBox menu
Figure 4-6: Filling a list box with objects
Figure 4-7: The domain controls
Figure 4-8: The date controls
Figure 4-9: Common date formats
Figure 4-10: Selecting multiple dates
Figure 4-11: A sample menu
Figure 4-12: Menu objects in .NET
Figure 4-13: The menu object hierarchy
Figure 4-14: Menu variations
Figure 4-15: The Visual Studio .NET menu designer
Figure 4-16: An owner-drawn menu
Figure 4-17: Displaying a list of installed fonts
Figure 4-18: Dragging a control around
Figure 4-19: A sample drag-and-drop application
Figure 4-20: A validation example
Figure 4-21: The ErrorProvider
Figure 5-1: The Form class lineage
Figure 5-2: A scrollable form
Figure 5-3: A scrollable panel
Figure 5-4: A simple dialog form
Figure 5-5: A single form interaction
Figure 5-6: A one-to-many form interaction
Figure 5-7: An owned form tester
Figure 5-8: Windows XP visual styles
Figure 5-9: A simple message box
Figure 5-10: Common dialogs
Figure 5-11: A frustrating window
Figure 5-12: The Address Book''''''''''''''''''''''''''''''''s minimum size
Figure 5-13: Setting control anchoring at design-time
Figure 5-14: Two ways to use anchoring
Figure 5-15: Anchored controls follow a corner in the container.
Figure 5-16: Anchoring the control and its container
Figure 5-17: A docked group box
Figure 5-18: A docked group box with padding
Figure 5-19: A basic splitter bar
Figure 5-20: Advanced docking
Figure 5-21: A docking strategy
Figure 5-22: A split view on a single document
Figure 5-23: Multiple splits
Figure 5-24: A collapsible split window
Figure 5-25: A shaped form
Figure 5-26: A noncontiguous shaped form
Figure 5-27: An irregular form with graphical content
Figure 5-28: Moving a shaped form
Figure 5-29: A form (with the desktop showing through)
Figure 5-30: An ancestor form for a wizard
Figure 5-31: Inheriting from a form
Figure 5-32: A custom property
Figure 6-1: The ImageList designer
Figure 6-2: Directly outputting an ImageList
Figure 6-3: Configuring assembly settings in .NET
Figure 6-4: Different view styles with the ListView control
Figure 6-5: A basic TreeView
Figure 6-6: Using a TreeView to configure settings
Figure 6-7: Drag-and-drop operations with a TreeView
Figure 6-8: A custom TreeView
Figure 6-9: Windows print settings
Figure 6-10: Toolbar styles
Figure 6-11: Toolbar designer
Figure 6-12: Two ways to synchronize a menu and toolbar
Figure 6-13: The simplest possible status bar
Figure 6-14: A status bar with panels
Figure 6-15: An unhelpful status bar in Microsoft Paint
Figure 6-16: The TabPage control
Figure 7-1: Creating a control project
Figure 7-2: Adding required assemblies
Figure 7-3: Referencing an assembly with controls
Figure 7-4: Your custom control in the Toolbox
Figure 7-5: A solution with a control project and a test projectUser Controls
Figure 7-6: A user control at design-time
Figure 7-7: User control inheritance
Figure 7-8: The progress control at design-time
Figure 7-9: The Progress user control in action
Figure 7-10: The Progress control in UML
Figure 7-11: The BitmapViewer at design-time
Figure 7-12: The BitmapViewer in UML
Figure 7-13: The BitmapViewer in action
Figure 7-14: A BitmapViewer event
Figure 7-15: The DirectoryTree in action
Figure 7-16: The MaskedTextBox in action
Figure 7-17: The MenuTextProvider in action
Figure 7-18: A HelpIconProvider extending two text boxes
Chapter 8: Design-Time Support for Custom Controls
Figure 8-1: Nondescript properties
Figure 8-2: A property configured with attributes
Figure 8-3: Configuring a toolbox bitmap
Figure 8-4: A custom toolbox bitmap
Figure 8-5: A resource file
Figure 8-6: A .resx file in Visual Studio .NET
Figure 8-7: Adding resources to an ordinary code file
Figure 8-8: Debugging design-time support
Figure 8-9: The DirectoryTree at design time
Figure 8-10: The PropertyGrid control
Figure 8-11: Control designer classes
Figure 8-12: Designer verbs
Figure 8-13: The Calendar themes
Figure 8-14: A custom drive selection window
Figure 8-15: Enumerations in the Properties window
Figure 8-16: The RegexTypeEditor
Figure 9-1: Information flow in .NET data binding
Figure 9-2: Binding a list to an array of strings
Figure 9-3: Binding to an array of objects without DisplayMember
Figure 9-4: Overriding ToString() in a data bound object
Figure 9-5: Binding to two controls
Figure 9-6: Data binding with other text box properties
Figure 9-7: Binding to a DataView
Figure 9-8: Binding to a filtered DataView
Figure 9-9: Multiple binding with ADO.NET
Figure 9-10: An editable bound data source
Figure 9-11: Formatting data
Figure 9-12: Formatting numbers to strings
Figure 9-13: "Converting" file names to image objects
Figure 9-14: Data binding under the hood
Figure 9-15: Data binding with custom navigation controls
Figure 9-16: Data binding with a master-detail list
Figure 9-17: Separately synchronized view of the same data
Figure 9-18: DataGrid navigation links
Figure 9-19: DataGrid master-detail lists
Figure 9-20: A custom DataGrid column
Figure 9-21: Custom row validation with data binding
Figure 9-22: A TreeView with embedded data
Figure 9-23: A decoupled TreeView
Chapter 10: MDI Interfaces and Workspaces
Figure 10-1: An MDI Child
Figure 10-2: Suspended controls
Figure 10-3: Working with the active child
Figure 10-4: The MDI child list
Figure 10-5: Different layout options
Figure 10-6: Merged menus
Figure 10-7: The document-view architecture in the ordering program
Figure 10-8: The OrderGridView
Figure 10-9: The OrderPrintPreview view
Figure 10-10: Synchronized views on the same document
Figure 10-11: Creating a floating toolbar
Figure 10-12: A dock cue
Figure 10-13: A docked window
Chapter 11: Dynamic User Interface
Figure 11-1: A ButtonMaker program
Figure 11-2: A dynamic system tray icon
Figure 11-3: A list of changed files
Figure 11-4: A vector-based drawing application
Figure 11-5: Resizing a square
Figure 11-6: Changing a square''''''''''''''''''''''''''''''''s background color
Figure 11-7: Dynamic content in the About box
Figure 11-8: Choosing a language when designing a form
Figure 11-9: Multiple .resx files for a form
Figure 11-10: Multiple satellite assemblies
Figure 11-11: Tables mapping control access permissions
Figure 11-12: Different menu structures
Figure 11-13: The dynamic ordering window
Figure 11-14: Pricing table structure
Figure 11-15: The SingleLineFlow layout manager in action
Figure 12-1: Painting to a GDI+ surface
Figure 12-2: Painting font text
Figure 12-3: Filling a form with an ellipse
Figure 12-4: Flawed resizing
Figure 12-5: A square painting program
Figure 12-6: Antialiasing with an ellipse
Figure 12-7: Smoothing modes for shapes
Figure 12-8: Smoothing modes for fonts
Figure 12-9: Using double buffering
Figure 12-10: Using translate transforms
Figure 12-11: Using rotational transforms
Figure 12-12: Line caps
Figure 12-13: Dash styles
Figure 12-14: HatchBrush styles
Figure 12-15: The LinearGradient brush
Figure 12-16: The TextureBrush
Figure 12-17: Hit testing with squares
Figure 12-18: Hit testing a nonrectangular path
Figure 12-19: Drawing pictures with ControlPaint
Figure 13-1: The GradientLabel
Figure 13-2: Custom thumbnails with the GradientLabel
Figure 13-3: The MarqueeLabel test utility
Figure 13-4: The HotTrackButton
Figure 13-5: A flawed drawing program
Figure 13-6: A corrected drawing program
Figure 13-7: A sample chart
Chapter 14: Help and Application-Embedded Support
Figure 14-1: WinHelp: a piece of living history
Figure 14-2: WinHelp 95: a facelift
Figure 14-3: HTML Help: the industrial revolution of help
Figure 14-4: Help 2: a new standard?
Figure 14-5: The HelpProvider
Figure 14-6: What''''''''''''''''''''''''''''''''s This Help
Figure 14-7: Collapsible help for one window
Figure 14-8: Integrated custom Help
Figure 14-9: Integrated custom HTML Help
Figure 14-10: A dialog with affordances
Figure 14-11: The Microsoft Agent control
Figure 14-12: The agent tryout application