| 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. |