Preface | p. xvii |
About the Author | p. xix |
About the Technical Reviewer | p. xx |
Acknowledgments | p. xxi |
Introduction | p. xxiii |
Creating Usable Interfaces | p. 1 |
Why Worry About the Interface? | p. 2 |
A Brief History of User Interfaces | p. 3 |
The Command-Line Era | p. 3 |
The Question-Answer Model | p. 5 |
The Menu-Driven Model | p. 7 |
The GUI Era | p. 8 |
Creativity vs. Convention | p. 10 |
Consistency in .NET | p. 11 |
The ""Act-Like-Microsoft"" Principle | p. 11 |
Administrative Utilities | p. 12 |
Know Your Application Type | p. 13 |
Know Your User | p. 14 |
Handling Complexity | p. 15 |
Segmenting Information | p. 16 |
Inductive User Interface | p. 17 |
Helpful Restrictions | p. 17 |
Restricting the User's Ability to Make a Mistake | p. 17 |
Restricting the User's Choices | p. 18 |
Restricting the User's Imagination | p. 19 |
Programming User Interface for the Web | p. 20 |
The Last Word | p. 21 |
Designing with Classes and Tiers | p. 23 |
Classes and Objects | p. 24 |
The Roles of Classes | p. 24 |
Classes and Types | p. 25 |
More About Objects | p. 28 |
User Interface Classes in .NET | p. 29 |
Controls Are Classes | p. 29 |
Controls Contain Other Controls | p. 30 |
Controls Derive from Other Controls | p. 33 |
Inheritance and the Form Class | p. 35 |
The Controls Collection | p. 36 |
Generating Code with Visual Studio .NET | p. 37 |
Interacting with a Control | p. 39 |
The View-Mediator Pattern | p. 40 |
Smart Controls | p. 42 |
Smart Forms | p. 43 |
Encapsulation | p. 44 |
Use Enumerations and Resource Classes | p. 44 |
Use Collections | p. 45 |
Restrain from Sharing Control References | p. 45 |
Define a Data Transfer Plan | p. 45 |
Use a Central Switchboard | p. 45 |
Create Data-Driven User Interfaces | p. 46 |
Developing in Tiers | p. 47 |
Problems with Three-Tier Design | p. 48 |
Three-Tier Design Consistency | p. 50 |
Fixing Three-Tier Design | p. 51 |
Using the DataSet | p. 52 |
Other Types of Application | p. 54 |
The Last Word | p. 54 |
Control Class Basics | p. 57 |
The Windows Forms Package | p. 57 |
The .NET Solution | p. 58 |
The Control Class | p. 60 |
Position and Size | p. 64 |
Color | p. 66 |
Fonts and Text | p. 69 |
Access Keys | p. 71 |
Control Relations | p. 71 |
Focus and the Tab Sequence | p. 72 |
Responding to the Mouse and Keyboard | p. 75 |
A Mouse/Keyboard Example | p. 78 |
Mouse Cursors | p. 79 |
Graphics and Painting | p. 79 |
Low-Level Members | p. 81 |
The Last Word | p. 82 |
Classic Controls | p. 83 |
Types of Controls | p. 83 |
Invisible Controls | p. 83 |
Provider Controls | p. 85 |
ActiveX Controls | p. 86 |
Should You Import ActiveX Controls? | p. 89 |
The Classic Control Gallery | p. 90 |
Labels | p. 90 |
LinkLabel | p. 91 |
Button | p. 94 |
TextBox | p. 94 |
CheckBox and RadioButton | p. 96 |
PictureBox | p. 97 |
List Controls | p. 97 |
Other Domain Controls | p. 102 |
Organizational Controls | p. 104 |
The Date Controls | p. 105 |
The DateTimePicker | p. 106 |
MonthCalendar | p. 108 |
Menus | p. 111 |
The Menu Class | p. 112 |
The MainMenu and ContextMenu Classes | p. 114 |
The Menultem Class | p. 115 |
The Visual Studio .NET Menu Designer | p. 118 |
Attaching a Menu | p. 118 |
Menu Events | p. 119 |
Copying and Cloning a Menu | p. 121 |
Merging a Menu | p. 121 |
Owner-Drawn Menus | p. 122 |
An Owner-Drawn Menu Control | p. 125 |
Drag-and-Drop | p. 130 |
""Fake"" Drag-and-Drop | p. 130 |
Authentic Drag-and-Drop | p. 132 |
Validation | p. 135 |
A Validation Example | p. 136 |
Validating with the ErrorProvider | p. 138 |
Validating with Regular Expressions | p. 140 |
The Last Word | p. 142 |
Forms | p. 143 |
The Form Class | p. 143 |
Form Size and Position | p. 148 |
Scrollable Forms | p. 152 |
Showing a Form | p. 154 |
Custom Dialog Windows | p. 155 |
Form Interaction | p. 158 |
Form Ownership | p. 161 |
Windows XP Styles | p. 163 |
Prebuilt Dialogs | p. 165 |
Resizable Forms | p. 171 |
The Problem of Size | p. 171 |
Minimum and Maximum Size | p. 172 |
Anchoring | p. 173 |
Docking | p. 177 |
Splitting Windows | p. 180 |
Docking with Panels | p. 181 |
Other Split Windows | p. 183 |
Irregularly Shaped Forms | p. 186 |
Shaped Form Content | p. 188 |
Moving Shaped Forms | p. 190 |
Forms with Holes | p. 192 |
Visual Inheritance | p. 193 |
Making an Ancestor Control Available | p. 195 |
Adding an Ancestor Property | p. 196 |
Overriding an Event Handler | p. 197 |
The Last Word | p. 199 |
Modern Controls | p. 201 |
The ImageList | p. 201 |
Dealing with the ImageList in Code | p. 203 |
ListView and TreeView | p. 205 |
Basic ListView | p. 206 |
Advanced ListView Tricks | p. 211 |
Label Editing | p. 215 |
Adding Information to a ListView | p. 216 |
Basic TreeView | p. 217 |
TreeView Structure | p. 218 |
TreeView Navigation | p. 219 |
Manipulating Nodes | p. 223 |
Selecting Nodes | p. 226 |
Advanced TreeView Tricks | p. 228 |
Node Pictures | p. 229 |
Expanding and Collapsing Levels | p. 230 |
TreeView Drag-and-Drop | p. 231 |
Taming the TreeView | p. 235 |
A Project Tree | p. 235 |
A Data-Aware TreeView | p. 238 |
Unusual Trees | p. 240 |
Design-Time Support for the Custom TreeView | p. 241 |
The ToolBar | p. 242 |
Synchronizing the ToolBar | p. 246 |
The StatusBar | p. 249 |
Basic StatusBar | p. 250 |
Synchronizing the StatusBar to a Menu | p. 252 |
The TabControl | p. 254 |
The NotifyIcon | p. 257 |
The Last Word | p. 258 |
Custom Controls | p. 259 |
Types of Custom Controls | p. 260 |
Control Projects | p. 261 |
The Class Library Project | p. 261 |
Referencing a Custom Control | p. 263 |
The GAC | p. 265 |
Creating User Controls | p. 269 |
The Progress User Control | p. 271 |
The Bitmap Thumbnail Viewer | p. 276 |
Testing the BitmapViewer | p. 283 |
Bit map Viewer Events | p. 284 |
Bit map Viewer Enhancements and Threading | p. 286 |
Inherited Controls | p. 289 |
Inherited Controls or User Controls? | p. 290 |
The DirectoryTree Control | p. 291 |
Testing the DirectoryTree | p. 293 |
A Masked TextBox Control | p. 294 |
Custom Extender Providers | p. 298 |
The Menu Text Provider | p. 298 |
The Help Icon Provider | p. 303 |
The Last Word | p. 307 |
Design-Time Support for Custom Controls | p. 309 |
Control Designer Basics | p. 310 |
Attributes | p. 310 |
Basic Serialization | p. 314 |
The Toolbox Bitmap | p. 316 |
Resource Files | p. 318 |
Testing Custom Controls | p. 321 |
Debugging Design-Time Support | p. 322 |
Testing for Design Mode | p. 323 |
The PropertyGrid Control | p. 325 |
Custom Designers | p. 326 |
Filtering Properties and Events | p. 327 |
Designer Verbs | p. 329 |
Control Designer Notifications | p. 334 |
Data Types and UITypeEditors | p. 335 |
Using Prebuilt UITypeEditors | p. 337 |
Custom UITypeEditors | p. 339 |
Licensing Custom Controls | p. 341 |
Simple LIC File Licensing | p. 341 |
Custom LIC File Licensing | p. 342 |
Advanced License Providers | p. 343 |
The Last Word | p. 346 |
Data Controls | p. 349 |
Introducing Data Binding | p. 349 |
Basic Data Binding | p. 350 |
Simple List Binding | p. 352 |
Binding Lists to Complex Objects | p. 353 |
Single-Value Binding | p. 357 |
ADO.NET Data Binding | p. 360 |
Multiple Control Binding | p. 363 |
Updating with Data Binding | p. 365 |
Formatting Data Before Binding | p. 367 |
Advanced Conversions | p. 370 |
Row Validation and Changes | p. 372 |
Data Binding Exposed | p. 373 |
Navigation with Data Binding | p. 374 |
Reacting to Record Navigation | p. 376 |
Creating Master-Detail Forms | p. 377 |
Creating a New Binding Context | p. 379 |
The DataGrid Control | p. 380 |
DataGrid Relations | p. 381 |
DataGrid Column Mapping | p. 382 |
Creating Custom DataGrid Column Styles | p. 383 |
Encapsulation with Data Controls | p. 387 |
Validating Bound Data | p. 388 |
Data-Aware Controls | p. 391 |
A Decoupled TreeView with Just-in-Time Nodes | p. 393 |
Can There Be a Data-Bound ListView Control? | p. 397 |
The Last Word | p. 398 |
MDI Interfaces and Workspaces | p. 399 |
The Story of MDI | p. 399 |
Types of MDI Applications | p. 400 |
MDI Essentials | p. 400 |
Finding Your Relatives | p. 402 |
Synchronizing MDI Children | p. 403 |
MDI Layout | p. 405 |
Merging Menus | p. 407 |
Managing Interface State | p. 408 |
Document-View Architecture | p. 410 |
A Document-View Ordering Program | p. 411 |
Floating Windows and Docking | p. 425 |
Floating Toolbars | p. 425 |
Dockable Windows | p. 429 |
The Last Word | p. 434 |
Dynamic User Interface | p. 435 |
The Case for Dynamic User Interface | p. 435 |
Creating Controls at Runtime | p. 436 |
A System Tray Application | p. 438 |
Using Controls in a Drawing Program | p. 443 |
Dynamic Content | p. 449 |
Localization | p. 450 |
A Dynamic Menu Example | p. 453 |
Data-Driven Programming | p. 457 |
A Data-Driven Pricing Application | p. 458 |
Control Layout Engines | p. 459 |
The SingleLineFlow Layout Manager | p. 460 |
Control Layout Engines As Extender Providers | p. 463 |
The Last Word | p. 464 |
GDI+ Basics | p. 465 |
Paint Sessions with GDI+ | p. 466 |
Accessing the Graphics Object | p. 466 |
Painting and Refreshing | p. 467 |
Optimizing GDI+ Painting | p. 470 |
Painting and Resizing | p. 470 |
Painting Portions of a Window | p. 472 |
Rendering Mode and Antialiasing | p. 475 |
Double Buffering | p. 477 |
Painting and Debugging | p. 480 |
The Graphics Class | p. 481 |
Coordinate Systems and Transformations | p. 485 |
Pens | p. 488 |
Brushes | p. 490 |
Hit Testing | p. 494 |
Hit Testing Nonrectangular Shapes | p. 496 |
The ControlPaint Class | p. 498 |
The Last Word | p. 500 |
GDI+ Controls | p. 501 |
Simple GDI+ Controls | p. 501 |
A Gradient Label | p. 502 |
Improving the GradientLabel's Design-Time Support | p. 505 |
A Marquee Label | p. 509 |
Creating Button Controls | p. 512 |
A Hot Tracking Button | p. 512 |
Reconsidering the Vector Drawing Program | p. 519 |
Solving the Bounding Problem | p. 520 |
A Simple Graphing Control | p. 525 |
The Last Word | p. 530 |
Help and Application-Embedded Support | p. 531 |
The Case for Help | p. 531 |
Types of Help | p. 532 |
WinHelp | p. 532 |
WinHelp 95 | p. 533 |
HTML Help | p. 534 |
MS Help 2 | p. 535 |
Some Help Authoring Tools | p. 536 |
Classic Bad Help | p. 537 |
Basic Help with the HelpProvider | p. 539 |
Control-Based and Form-Based Help | p. 542 |
Invoking Help Programmatically | p. 543 |
Help Without the HelpProvider | p. 544 |
Using Database-Based Help | p. 545 |
Using Task-Based Help | p. 546 |
Creating Your Own Help | p. 548 |
Application-Embedded Support | p. 550 |
Affordances | p. 551 |
Agents | p. 553 |
The Last Word | p. 559 |
Index | p. 561 |
Table of Contents provided by Publisher. All Rights Reserved. |