pro .net 2.0 windows forms and custom controls in c# · viii contents chapter 2 control basics . ....
TRANSCRIPT
Pro .NET 2.0 Windows Forms and Custom Controls in C#
■ ■ ■
Matthew MacDonald
Pro .NET 2.0 Windows Forms and Custom Controls in C#
Copyright © 2006 by Matthew MacDonald
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher.
ISBN (pbk): 1-59059-439-8
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark.
Lead Editor: Dominic ShakeshaftTechnical Reviewer: Christophe NasarreEditorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Tony Davis, Jason Gilmore,
Jonathan Hassell, Chris Mills, Dominic Shakeshaft, Jim SumserAssociate Publisher: Grace WongProject Manager: Beckie BrandCopy Edit Manager: Nicole LeClercCopy Editor: Candace EnglishAssistant Production Director: Kari Brooks-CoponyProduction Editor: Janet VailCompositor: Susan GlinertProofreader: Nancy SixsmithIndexer: Michael BrinkmanArtist: Kinetic Publishing Services, LLCInterior Designer: Van Winkle Design GroupCover Designer: Kurt KramesManufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected], or visit http://www.springeronline.com.
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit http://www.apress.com.
The information in this book is distributed on an “as is” basis, without warranty. Although every precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work.
The source code for this book is available to readers at http://www.apress.com in the Source Code section.
For Nora and Paul
v
Contents at a Glance
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
PART 1 ■ ■ ■ Windows Forms Fundamentals■CHAPTER 1 User Interface Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
■CHAPTER 2 Control Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
■CHAPTER 3 Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
■CHAPTER 4 The Classic Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
■CHAPTER 5 Images and Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
■CHAPTER 6 Lists and Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
■CHAPTER 7 Drawing with GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
■CHAPTER 8 Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
PART 2 ■ ■ ■ Custom Controls■CHAPTER 9 Custom Control Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
■CHAPTER 10 User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
■CHAPTER 11 Derived Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
■CHAPTER 12 Owner-Drawn Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
■CHAPTER 13 Design-Time Support for Custom Controls . . . . . . . . . . . . . . . . . . . . 425
PART 3 ■ ■ ■ Modern Controls■CHAPTER 14 Tool, Menu, and Status Strips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
■CHAPTER 15 The DataGridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
■CHAPTER 16 Sound and Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
■CHAPTER 17 The WebBrowser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
vi ■CO N T E N T S AT A G L A N C E
PART 4 ■ ■ ■ Windows Forms Techniques■CHAPTER 18 Validation and Masked Editing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
■CHAPTER 19 Multiple and Single Document Interfaces . . . . . . . . . . . . . . . . . . . . 655
■CHAPTER 20 Multithreading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
■CHAPTER 21 Dynamic Interfaces and Layout Engines . . . . . . . . . . . . . . . . . . . . . . 733
■CHAPTER 22 Help Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781
PART 5 ■ ■ ■ Advanced Custom Controls■CHAPTER 23 Skinned Forms and Animated Buttons . . . . . . . . . . . . . . . . . . . . . . . 815
■CHAPTER 24 Dynamic Drawing with a Design Surface . . . . . . . . . . . . . . . . . . . . . 845
■CHAPTER 25 Custom Extender Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
■CHAPTER 26 Advanced Design-Time Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
■APPENDIX A Creating Usable Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
■APPENDIX B ClickOnce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 971
vii
Contents
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
PART 1 ■ ■ ■ Windows Forms Fundamentals■CHAPTER 1 User Interface Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Classes and Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
The Roles of Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Classes and Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
User Interface Classes in .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Controls Are Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Controls Can Contain Other Controls . . . . . . . . . . . . . . . . . . . . . . . . . 10
Controls Can Extend Other Controls . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Inheritance and the Form Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Accessing Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Interacting with a Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Overriding Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
The View-Mediator Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Smart Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Smart Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Generating User-Interface Code in Visual Studio . . . . . . . . . . . . . . . 25
The Component Tray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
The Hidden Designer Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Application Lifetime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Designing Windows Forms Applications . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Developing in Tiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Contents
viii ■C O N T E N T S
■CHAPTER 2 Control Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
The Windows Forms Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
The .NET Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
The Control Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Control Relations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Windows XP Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Position and Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Overlapping Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Alpha Blending . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Fonts and Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
System Fonts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Large Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Access Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Focus and the Tab Sequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Responding to the Mouse and Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Handling the Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Handling the Mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
A Mouse/Keyboard Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Mouse Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Low-Level Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
■CHAPTER 3 Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
The Form Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Form Size and Position. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Scrollable Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Showing a Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Custom Dialog Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Form Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Form Ownership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Prebuilt Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Resizable Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
The Problem of Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Minimum and Maximum Form Size . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Anchoring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Docking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Autosizing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
■C O N T E N T S ix
Splitting Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Building Split Windows with Panels . . . . . . . . . . . . . . . . . . . . . . . . . 106
Other Split Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
■CHAPTER 4 The Classic Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
The Classic Control Gallery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Labels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
LinkLabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
TextBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
RichTextBox. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
CheckBox and RadioButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
PictureBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Other Domain Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
The Date Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
The DateTimePicker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
MonthCalendar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Container Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
The TabControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
AutoComplete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Drag-and-Drop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
“Fake” Drag-and-Drop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Authentic Drag-and-Drop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Extender Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
The NotifyIcon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
ActiveX Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Should You Import ActiveX Controls? . . . . . . . . . . . . . . . . . . . . . . . . 149
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
■CHAPTER 5 Images and Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
The Image Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Common Controls and Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
The ImageList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
x ■C O N T E N T S
Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Adding a Type-Safe Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
How Type-Safe Resources Work. . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Form Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Creating Additional Resource Files . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Localization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Creating a Localizable Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
How Localization Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
■CHAPTER 6 Lists and Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
ListView Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
View Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
More Advanced ListViews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
ListView Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Label Editing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
ListView Grouping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Searching and Hit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
ListView Virtualization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
TreeView Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
TreeView Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
TreeView Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Manipulating Nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Selecting Nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
More Advanced TreeViews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Node Pictures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Expanding and Collapsing Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
TreeView Drag-and-Drop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
■CHAPTER 7 Drawing with GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Understanding GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Paint Sessions with GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Accessing the Graphics Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Painting and Repainting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Refreshes and Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Painting and Resizing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
■C O N T E N T S xi
The Graphics Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Rendering Mode and Antialiasing . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Pens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Brushes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Drawing Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
The GraphicsPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
More-Advanced GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Alpha Blending . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Clipping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Coordinate Systems and Transformations . . . . . . . . . . . . . . . . . . . . 240
Performing a Screen Capture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Optimizing GDI+ Painting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Painting and Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Double Buffering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Painting Portions of a Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Hit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Painting Windows Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
The ControlPaint Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Visual Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Visual Style Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Drawing with the VisualStyleRenderer . . . . . . . . . . . . . . . . . . . . . . . 258
Using a Control Renderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
■CHAPTER 8 Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Introducing Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
.NET Data Binding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Basic Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Data Consumers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Data Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
A Data Access Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Binding to a List (Complex Binding) . . . . . . . . . . . . . . . . . . . . . . . . . 270
Binding to a Grid (Complex Binding) . . . . . . . . . . . . . . . . . . . . . . . . . 272
Binding to Any Control (Simple Binding) . . . . . . . . . . . . . . . . . . . . . 273
Unusual Single-Value Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
xii ■C O N T E N T S
Common Data-Binding Scenarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Updating with Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Formatting Data with a Format String . . . . . . . . . . . . . . . . . . . . . . . 278
Formatting Data with the Format and Parse Events . . . . . . . . . . . . 280
Advanced Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Creating a Lookup Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Row Validation and Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Data Binding Exposed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Navigation with Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Reacting to Record Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Creating Master-Detail Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Creating a New Binding Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Validating Bound Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Binding to Custom Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Overriding ToString() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Supporting Grid Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Automatic Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Binding Directly to a Database (Table Adapters) . . . . . . . . . . . . . . . 304
Using a Strongly Typed DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Binding Directly to a Custom Object . . . . . . . . . . . . . . . . . . . . . . . . . 310
Data-Aware Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
A Decoupled TreeView with Just-in-Time Nodes . . . . . . . . . . . . . . 314
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
PART 2 ■ ■ ■ Custom Controls■CHAPTER 9 Custom Control Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Understanding Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Types of Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Custom Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Control Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
The Library Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
The Disposable Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
The Client Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Automatic Toolbox Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Customizing the Toolbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
■C O N T E N T S xiii
The GAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Creating a Key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Applying a Key to a Control Assembly . . . . . . . . . . . . . . . . . . . . . . . 334
Attaching Keys in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Installing a Control in the GAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
■CHAPTER 10 User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Understanding User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
The Progress User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Creating the Progress User Control . . . . . . . . . . . . . . . . . . . . . . . . . 338
Testing the Progress User Control . . . . . . . . . . . . . . . . . . . . . . . . . . 340
The Back Door. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
User Control Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
An Automatic Progress Bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
The Bitmap Thumbnail Viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Creating the BitmapViewer User Control . . . . . . . . . . . . . . . . . . . . . 345
Testing the BitmapViewer Control . . . . . . . . . . . . . . . . . . . . . . . . . . 350
BitmapViewer Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Performance Enhancements and Threading . . . . . . . . . . . . . . . . . . 352
Simplifying Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
User Controls and Dynamic Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
The Wizard Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
The Wizard Step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
The Wizard Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Testing the Wizard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
■CHAPTER 11 Derived Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Understanding Derived Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Extending Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Derived Controls or User Controls?. . . . . . . . . . . . . . . . . . . . . . . . . . 367
The ProjectTree Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
The Data Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Node Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Node Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
Adding Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Project Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
A Custom TreeNode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Design-Time Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
xiv ■C O N T E N T S
The DirectoryTree Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Filling the Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Directory Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Deriving Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
A Simple Derived Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Making an Ancestor Control Available . . . . . . . . . . . . . . . . . . . . . . . 382
Adding a Property in the Ancestor Form . . . . . . . . . . . . . . . . . . . . . 383
Dealing with Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
■CHAPTER 12 Owner-Drawn Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Understanding Owner-Drawn Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
A Simple Owner-Drawn ListBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
A More Advanced Owner-Drawn ListBox . . . . . . . . . . . . . . . . . . . . . 391
An Owner-Drawn TreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Owner-Drawn Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Double Buffering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
The MarqueeLabel Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
The GradientPanel Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
The SimpleChart Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
The CollapsiblePanel Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
■CHAPTER 13 Design-Time Support for Custom Controls . . . . . . . . . . . . . . 425
Design-Time Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
The Key Players . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Basic Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Attributes and Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
The Toolbox Bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Debugging Design-Time Support . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Code Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Basic Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Default Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Making Serialization Decisions Programmatically . . . . . . . . . . . . . 439
Serialization Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Batch Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
Localizable Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
■C O N T E N T S xv
Type Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Dealing with Nested Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Creating a Type Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
Attaching a Type Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
The ExpandableObjectConverter . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Creating a Nested Object with a Constructor . . . . . . . . . . . . . . . . . 455
Custom Serialization with CodeDOM . . . . . . . . . . . . . . . . . . . . . . . . 458
Providing Standard Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Type Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Using Prebuilt Type Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Using Custom Type Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
PART 3 ■ ■ ■ Modern Controls■CHAPTER 14 Tool, Menu, and Status Strips . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
ToolStrip Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
The ToolStripItem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
The ToolStripContainer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
The StatusStrip and MenuStrip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Creating a Status Bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
ToolStrip Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
A Main Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
A Context Menu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
ToolStrip Customization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Hosting Other Controls in the ToolStrip . . . . . . . . . . . . . . . . . . . . . . 504
Taking Control of Overflow Menus . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Allowing Runtime Customization . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Customizing the ToolStrip Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
The ToolStripManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Customizing a Renderer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Changing the Colors of the ProfessionalToolStripRenderer . . . . . . 519
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
■CHAPTER 15 The DataGridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
The DataGrid Legacy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Introducing the DataGridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
The DataGridView and Very Large Data Sources . . . . . . . . . . . . . . 523
xvi ■C O N T E N T S
Bare-Bones Data-Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
The DataGridView Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Column Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Creating an Unbound Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Cell Selection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Navigation Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Column-Based Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
Formatting the DataGridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Column and Row Resizing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
DataGridView Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Custom Cell Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Hiding, Moving, and Freezing Columns . . . . . . . . . . . . . . . . . . . . . . 551
Using Image Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
Using Button Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Editing and Validation with the DataGridView . . . . . . . . . . . . . . . . . . . . . 558
Editing Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Default Values for New Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Handling Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Validating Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Constraining Choices with a List Column. . . . . . . . . . . . . . . . . . . . . 566
DataGridView Customization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Custom Cell Painting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Custom Cells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Custom Cell Edit Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
■CHAPTER 16 Sound and Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
The SoundPlayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Synchronous and Asynchronous Playback . . . . . . . . . . . . . . . . . . . 580
System Sounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Advanced Media with DirectShow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Using Quart.dll Through Interop . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Playing MP3, MIDI, WMA, and More . . . . . . . . . . . . . . . . . . . . . . . . . 584
Showing MPEG and Other Video Types . . . . . . . . . . . . . . . . . . . . . . 589
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
■C O N T E N T S xvii
■CHAPTER 17 The WebBrowser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
WebBrowser Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Navigating to a Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
WebBrowser Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
A WebBrowser Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Printing, Saving, and Fine-Tuning. . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Blending Web and Windows Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Build a DOM Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Extract All Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Scripting a Web Page with .NET Code . . . . . . . . . . . . . . . . . . . . . . . 606
Scripting an HTML Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
PART 4 ■ ■ ■ Windows Forms Techniques■CHAPTER 18 Validation and Masked Editing . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Validating at the Right Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Validation Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
The Validation Event Sequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Handling Validation Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Closing a Form with Validating . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
The ErrorProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Showing Error Icons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Customizing Error Icons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624
Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Regular Expression Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
Validating with Regular Expressions. . . . . . . . . . . . . . . . . . . . . . . . . 628
Custom Validation Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
Understanding the ASP.NET Validation Controls . . . . . . . . . . . . . . . 630
Building the BaseValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Building Three Custom Validators . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Using the Custom Validators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Masked Edit Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
Creating a Mask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
The MaskedTextBox Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
MaskedTextBox Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Registering a Custom Mask. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Creating Custom Masked Controls . . . . . . . . . . . . . . . . . . . . . . . . . . 650
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
xviii ■C O N T E N T S
■CHAPTER 19 Multiple and Single Document Interfaces . . . . . . . . . . . . . . . 655
The Evolution of Document Interface Models . . . . . . . . . . . . . . . . . . . . . 655
MDI Essentials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
Finding Your Relatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660
Synchronizing MDI Children . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
MDI Window List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
MDI Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
Merging Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Managing Interface State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
Document-View Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
A Document-View Ordering Program . . . . . . . . . . . . . . . . . . . . . . . . 671
Multiple-Document SDI Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Gaps in the Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
■CHAPTER 20 Multithreading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
Multithreading Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
The Goals of Multithreading. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Options for Asynchronous Programming . . . . . . . . . . . . . . . . . . . . . 695
Asynchronous Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
Polling and Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699
Multithreading in a Windows Application . . . . . . . . . . . . . . . . . . . . . . . . . 700
The Worker Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701
The Asynchronous Call. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
Marshalling Calls to the Right Thread . . . . . . . . . . . . . . . . . . . . . . . 705
Locking and Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
The BackgroundWorker Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
A Simple BackgroundWorker Test . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Tracking Progress. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
Supporting a Cancel Feature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
The Thread Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Creating a ThreadWrapper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
Creating the Derived Task Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722
Creating and Tracking Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
Improving the Thread Wrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
Task Queuing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
■C O N T E N T S xix
■CHAPTER 21 Dynamic Interfaces and Layout Engines . . . . . . . . . . . . . . . . 733
The Case for Dynamic User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
Dynamic Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
An Adaptable Menu Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
A Database-Driven Adaptable Menu. . . . . . . . . . . . . . . . . . . . . . . . . 737
Creating Controls at Runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Managing Control Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742
The Layout Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
A Simple Hand-Made Layout Manager. . . . . . . . . . . . . . . . . . . . . . . 744
Problems with the Simple Layout Manager . . . . . . . . . . . . . . . . . . . 747
Layout Engines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748
Creating a Custom Layout Engine. . . . . . . . . . . . . . . . . . . . . . . . . . . 749
The FlowLayoutPanel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
The FlowBreak Extended Property . . . . . . . . . . . . . . . . . . . . . . . . . . 752
Margins and Padding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Automatic Scrolling and Sizing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754
The TableLayoutPanel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755
Row and Column Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756
Generating New Columns and Rows . . . . . . . . . . . . . . . . . . . . . . . . 758
Positioning Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Extended Properties with the TableLayoutPanel . . . . . . . . . . . . . . . 760
Layout Panel Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
TableLayoutPanel: A Localizable Dialog Box . . . . . . . . . . . . . . . . . . 761
TableLayoutPanel: BiPane Proportional Resizing . . . . . . . . . . . . . . 763
TableLayoutPanel: A List of Settings . . . . . . . . . . . . . . . . . . . . . . . . 764
TableLayoutPanel: Forms From a File . . . . . . . . . . . . . . . . . . . . . . . 766
FlowLayoutPanel: A Modular Interface . . . . . . . . . . . . . . . . . . . . . . . 776
Markup-Based User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
XAML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
WFML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
■CHAPTER 22 Help Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781
Understanding Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781
Classic “Bad Help” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782
Types of Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783
Help-Authoring Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786
xx ■C O N T E N T S
Basic Help with the HelpProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787
Simple Pop-Ups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789
External Web Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790
Compiled Help Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791
HTML Help with the HelpProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792
Creating a Basic HTML Help File . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792
Using Context-Sensitive Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797
Control-Based and Form-Based Help . . . . . . . . . . . . . . . . . . . . . . . . 797
Invoking Help Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Using Database-Based Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799
Using Task-Based Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800
Creating Your Own Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802
Application-Embedded Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
Affordances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Agents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
PART 5 ■ ■ ■ Advanced Custom Controls■CHAPTER 23 Skinned Forms and Animated Buttons . . . . . . . . . . . . . . . . . . 815
Shaped Forms and Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
A Simple Shaped Form. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 816
Creating a Background for Shaped Forms . . . . . . . . . . . . . . . . . . . . 817
Moving Shaped Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 821
Shaped Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Animated Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Basic Animated Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
A Base Class for Animated Buttons . . . . . . . . . . . . . . . . . . . . . . . . . 823
Improving the Performance of Owner-Drawn Controls . . . . . . . . . . . . . 839
Caching Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839
Reusing Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
■CHAPTER 24 Dynamic Drawing with a Design Surface . . . . . . . . . . . . . . . 845
A Drawing Program with Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845
The Shape Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846
The Drawing Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849
■C O N T E N T S xxi
A Drawing Program with Shape Objects . . . . . . . . . . . . . . . . . . . . . . . . . 855
The Shape Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 856
The Shape Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 863
The Drawing Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877
■CHAPTER 25 Custom Extender Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
Understanding Extender Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
The StatusStripHelpLabel Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881
Choosing a Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881
Choosing the Control to Extend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881
Providing the Extended Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882
Implementing the SetXxx() and GetXxx() Methods . . . . . . . . . . . . . 883
Testing the Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Changing How Extended Properties Appear . . . . . . . . . . . . . . . . . . 886
The HelpIconProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 886
Choosing a Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 886
Providing the Extended Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 892
■CHAPTER 26 Advanced Design-Time Support . . . . . . . . . . . . . . . . . . . . . . . . . 893
Control Designers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
Filtering Properties and Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896
Interacting with the Mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
Selection and Resize Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
Designer Verbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903
Designer Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907
Smart Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912
The Action List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 913
The DesignerActionItem Collection . . . . . . . . . . . . . . . . . . . . . . . . . . 915
The Control Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917
Container and Collection Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918
Collection Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918
Container Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Licensing Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 928
Simple LIC File Licensing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 929
Custom LIC File Licensing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 931
More-Advanced License Providers . . . . . . . . . . . . . . . . . . . . . . . . . . 931
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
xxii ■C O N T E N T S
■APPENDIX A Creating Usable Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
Why Worry About the Interface? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
A Brief History of User Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 936
The Command-Line Era . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 936
The Question-Answer Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 938
The Menu-Driven Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
The GUI Era . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Creativity vs. Convention . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 942
Consistency in .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 942
The “Act Like Microsoft Office” Principle. . . . . . . . . . . . . . . . . . . . . 943
Administrative Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 943
Know Your Application Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 944
Know Your User. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945
Handling Complexity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945
Segmenting Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 946
Inductive User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 947
Helpful Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 947
Restricting the User’s Ability to Make a Mistake. . . . . . . . . . . . . . . 947
Restricting the User’s Choices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Restricting the User’s Imagination . . . . . . . . . . . . . . . . . . . . . . . . . . 949
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949
■APPENDIX B ClickOnce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951
The Ground Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
The ClickOnce Installation Model . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
ClickOnce Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 953
ClickOnce Limitations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954
A Simple ClickOnce Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954
Choosing a Location . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Deployed Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 959
Installing a ClickOnce Application . . . . . . . . . . . . . . . . . . . . . . . . . . . 960
Updating a ClickOnce Application . . . . . . . . . . . . . . . . . . . . . . . . . . . 961
ClickOnce Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962
Publish Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962
Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963
Prerequisites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 964
Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 965
■C O N T E N T S xxiii
ClickOnce Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 966
ClickOnce Security Prompts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 967
Partial Trust and ClickOnce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 967
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 969
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 971
xxv
Foreword
The late 1990s brought us the revolution of the Internet. After 15 years of moving from a server-based model of computing to a client/server-based model, the pendulum swung back heavily toward the server with the rapid growth of Web pages, HTML, and server-based applications.
There was much to like about Web applications. Designers liked them because they had lots of great ways to apply nice-looking style sheets and layouts. Companies liked them because they did away with all the expensive and risky aspects of deploying client applications. All that had to be done was to install the application on a Web server, and you were done. No risk of breaking other applications or need to physically install the software on every machine in the organization. And for document viewing, HTML was a relatively easy language to learn, so it allowed many people to do some manner of software development with no prior skills.
But not everything was perfect. Large-scale Web applications were difficult to write and manage. There were differences between browsers. There weren’t very good tools for debugging and developments. The applications weren’t taking advantage of all the power on the client machines—hard drives, video cards, and CPUs. And most importantly, the user interfaces generally were well-suited only to the most basic data entry. If you needed real-time display or advanced visualization, things got very difficult.
In early 2002, Windows Forms was released as part of the Microsoft .NET Framework, Version 1.0. This changed the landscape in two fundamental ways. First, it gave programmers a consistent, approachable API and toolset with which to build very sophisticated applications for Microsoft Windows without having to know the Win32 SDK forward and backward. And second, the .NET Framework and Common Language Runtime (CLR) allowed client applica-tions to be deployed via a Web server. Once you got the .NET Framework installed on the client machines you could have true zero-cost or “no-touch” deployment.
In conjunction with this, organizations were beginning to recognize the aforementioned shortcomings of Web applications in certain scenarios, and started to once again deploy client applications.
With the release of Version 2.0 of the Microsoft .NET Framework, even more client momentum is building. Windows Forms now allows developers to build applications with the look and feel of not only Windows itself, but of Microsoft Office as well. And then they can deploy those applications using a much-improved deployment technology called ClickOnce that is integrated directly into the Microsoft Visual Studio 2005 design experience. Gone are the days when organiza-tions had to default to writing Web applications. Now they can choose the technology that is appropriate for the task at hand, which means they can implement their vision without compromising the user experience. Version 1.0 of Windows Forms and the .NET Framework were a good start, but Version 2.0 takes smart client development to the next level!
Matthew MacDonald understands this and has built a great resource for developers using Windows Forms to create great, rich applications. Whether the goal is to write components for internal use or a full application, this book will help you get there and deliver great results. Welcome back to the client.
xxvi ■F O R E W O R D
Before Windows Forms, there were application developers and there were control developers. Even with Visual Basic, controls were usually authored in another language like Visual C++ and required a specific set of skills. However, with an object-oriented framework like Windows Forms, customizing control behavior is done with the same techniques as other application development, which gives developers a powerful new tool to really make their client applications deliver a great user experience that just can’t be matched anywhere else. Pro .NET 2.0 Windows Forms and Custom Controls in C# does an excellent job of highlighting those possibilities and equipping developers with the techniques to make them a reality. Whether it’s creating an owner-drawn TreeView, using the new layout features to build dynamic interfaces, or creating skinned custom controls, this book shows you how.
The practical, task-based approach of Pro .NET 2.0 Windows Forms and Custom Controls in C# allows it to cover a wide range of Windows Forms topics, but still provide the technical depth to help developers deliver features. While many other resources read more like technical reference docs, Pro .NET 2.0 Windows Forms and Custom Controls does an excellent job of filtering the information down to what developers really need to harness the power and inno-vations of Windows Forms 2.0 to deliver truly world-class client applications.
Shawn BurkeDevelopment Manager, Windows Forms Team
Microsoft Corporation
xxvii
About the Author
■MATTHEW MACDONALD is an author, educator, and MCSD developer. He’s a regular contributor to programming journals, and the author of more than a dozen books about .NET programming, including User Interfaces in C#: Windows Forms and Custom Controls (Apress), Pro ASP.NET 2.0 (Apress), and Microsoft .NET Distributed Applications(Microsoft Press). In a dimly remembered past life, he studied English literature and theoretical physics.
xxix
About the Technical Reviewer
■CHRISTOPHE NASARRE is a development architect for Business Objects, a company which develops desktop and Web-based business intelligence solutions. During his spare time, Christophe writes articles for MSDN Magazine, MSDN/Longhorn, and ASPToday, and he has reviewed books on Win32, COM, MFC, and .NET since 1996.
xxxi
Acknowledgments
No author can complete a book without a small army of helpful individuals. I’m deeply indebted to the whole Apress team, including Grace Wong, Beckie Stones, and Janet Vail, who helped everything move swiftly and smoothly; Candace English, who performed the copy edit; and many other individuals who worked behind the scenes indexing pages, drawing figures, and proofreading the final copy. I owe a special thanks to Gary Cornell, who always offers invaluable advice about projects and the publishing world.
I owe a sincere thanks to Christophe Nasarre, who provided unfailingly excellent and insightful tech-review comments—they’ve helped me to fill gaps and improve the overall quality of this book. I’ve worked with many technical reviewers, and Christophe is clearly one of the best. Just as useful were the readers who took time out to report problems and ask good questions about the first edition of this book.
This book was written with close support from the Microsoft Windows Forms team, who took time out to review individual chapters and answer many emails filled with obscure questions. Although I didn’t always know where the answers were coming from, I can safely say that I owe thanks to Shawn Burke, Mike Harsh, Jessica Fosler, Joe Stegman, Miguel Lacouture-Amaya, Jeff Chrisope, Mark Boulter, Scott Berry, Mike Henderlight, Raghavendra Prabhu, Simon Muzio, Mark Rideout, and many others for their replies and tech-review comments. I’m especially indebted to Erick Ellis, who fielded all my questions and followed up to make sure I had timely information and review comments. It was a great experience to write this book with their feedback.
Finally, I’d never write any book without the support of my wife and these special individuals: Nora, Razia, Paul, and Hamid. Thanks, everyone!
Matthew MacDonald
xxxiii
Introduction
Four years after the .NET Framework first hit the programming scene, smart client applications still refuse to die.
This is significant because when .NET first appeared, all too many people assumed it was about to usher in a new world of Web-only programming. In fact, for a short time Microsoft’s own Web site described the .NET Framework in a single sentence as a “platform for building Web services and Web applications”—ignoring the Windows technology that made the company famous.
Now that the dust has settled, it’s clear that Web and Windows applications aren’t locked in the final rounds of a life-or-death battle. Instead, both technologies are flourishing. And not only are both technologies gaining strength, but they’re also stealing some of each other’s best features. For example, the latest release of .NET gives Web developers rich controls like menus and trees that were previously the exclusive domain of Windows coders (or Web-heads who weren’t afraid to write a mess of hardcore client-side JavaScript). On the other hand, Windows applications are gaining easy Web-based deployment, more-flexible layout options, and the ability to display HTML. All of these innovations point to many productive years ahead for Web and Windows developers alike.
If you’ve picked up this book, you’ve already decided to learn more about programming Windows smart clients with .NET. Although both Web and Windows applications have their strengths and weaknesses, only Windows applications allow you to break out of the confines of the browser and take full advantage of the client computer. With Windows Forms, you can play sound and video, display dynamic graphics, react to the user’s actions instantaneously, and build sophisticated windowed interfaces.
In this book, you’ll learn how to use all of these techniques to design state-of-the-art appli-cation interfaces. Best of all, you won’t just learn how to use the existing controls of the .NET Framework—you’ll also learn everything you need to extend, enhance, and customize them.
About This BookThis book focuses relentlessly on Windows Forms, the .NET toolkit for building modern Windows interfaces.
In this book you’ll learn about several sides of user interface programming. Some of the key themes include the following:
• Dissecting the .NET controls. Although this book is not a reference, it contains an exhaustive tour of just about every .NET user interface element you’ll ever want to use.
• Best practices and design tips. As a developer, you need to know more than how to add a control to a window. You also need to know how to create an entire user interface framework that’s scalable, flexible, and reusable.
xxxiv ■I N T R O D U C T I O N
• How to enhance .NET controls and build your own. In this book, you’ll learn key tech-niques to extend existing controls and create your own from scratch. You’ll even learn how to draw controls from scratch with GDI+, the remarkable .NET drawing framework.
• How to design elegant user interfaces for the average user. This subject isn’t the focus of the book, but you’ll get a great overview from Appendix A. You’ll also learn more from tips and notes throughout the book.
• Advanced user interface techniques. Features are neat, but how do you use them? In this book you’ll see practical examples of common techniques like document-view architecture, validation, and hit testing. You’ll also learn how to dynamically generate forms from a database, unshackle data binding, and build an integrated help system.
Of course, it’s just as important to point out what this book doesn’t contain. You won’t find the following subjects in this book:
• A description of core .NET concepts. These key concepts, like namespaces, assemblies, exception handling, and metadata, are explained in countless books, including a number of excellent C# and VB .NET titles from Apress.
• A primer on object-oriented design. No .NET programmer can progress very far without a solid understanding of classes, interfaces, and other .NET types. In this book, many examples rely on these basics, using objects to encapsulate, organize, and transfer information.
• A reference for Visual Studio 2005. The new integrated design environment provides powerful customization, automation, and productivity features that deserve a book of their own. Though this book assumes you’re using Visual Studio, and occasionally points out an often-overlooked feature, it assumes that you already know your way around the development environment.
You’ll get the most out of this book if you’ve already read another, more general .NET book. If you haven’t learned the .NET fundamentals yet, you’ll still be able to work through this book, but you’ll need to travel at a slower pace and you may need to refer to the MSDN Help files to clear up issues you’ll encounter along the way.
■Note This book is targeted at experienced developers who want to get the most out of .NET. If you have never programmed with a language like Visual Basic, C++/C#, or Java before, this isn’t the place to start. Instead, start with an introductory book on object-oriented design or programming fundamentals. On the other hand, if you already have some experience with .NET 1.0 or 1.1, welcome—you’ll find yourself right at home!
Chapter OverviewThe following overview describes what each chapter covers. If you already have some experience with Windows Forms, feel free to skip from chapter to chapter. If you’re relatively new to Windows Forms development, it’s probably best to read through the book to make sure you learn the basics before tackling more-advanced topics.
■I N T R O D U C T I O N xxxv
Part 1: Windows Forms Fundamentals
In this part you’ll consider the core topics you need to understand to design smart clients. In Chapter 1 you’ll start out by exploring the class model that underpins Windows Forms user interfaces. In Chapters 2 and 3 you’ll explore the fundamental Control and Form classes. Chapter 4 describes the most common Windows controls. Chapter 5 shows how you can embed images and other binary resources into your compiled applications. Chapter 6 considers trees and lists, a hallmark of modern Windows applications. Finally, Chapters 7 and 8 consider two impressive higher-level features that are built into the Windows Forms model—GDI+ (for hand-drawing controls) and data binding (for displaying and updating data without writing tedious code).
Part 2: Custom Controls
In this part, you’ll tackle one of the most important areas of Windows Forms design—creating customized controls that add new features, use fine-tuned graphics, and encompass low-level details with higher-level object models. In Chapter 9 you’ll learn about the basic types of custom controls you can create and see how to set up a custom control project. You’ll then continue to create user controls, which combine other controls into reusable groups (Chapter 10); derived controls, which enhance existing .NET control classes (Chapter 11); and owner-drawn controls, which use GDI+ to render UI from scratch (Chapter 12). Chapter 13 shows how you can add design-time support so your custom controls behave properly at design time.
Part 3: Modern Controls
In this part, you’ll branch out to some of the most powerful Windows Forms controls. In Chapter 14, you’ll explore the new ToolStrip, which provides a thoroughly customizable and flexible model for toolbars, menus, and status bars. In Chapter 15 you’ll consider the DataGridView—an all-in-one grid control for displaying data. In Chapter 16 you’ll look at the still woefully weak support for sound and video in the .NET Framework, and learn how to improve the picture with interop. Finally, in Chapter 17 you’ll learn how the WebBrowser lets you show HTML pages in a Windows application, and you’ll learn some remarkable tricks for integrating the two (with Windows code that manipulates the page and JavaScript Web code that triggers actions in your application).
Part 4: Windows Forms Techniques
In this part, you’ll considerable indispensable techniques for serious Windows Forms programmers. In Chapter 18 you’ll consider a host of approaches to validation, from masked edit controls to custom validation components that mimic ASP.NET, and perform their work automatically. Chapter 19 tackles MDI and SDI interfaces and shows you how to build a document-view framework. Chapter 20 explores the world of multithreading, and provides practical advice on how to write safe, performance-asynchronous code in a Windows application. Chapter 21 shows how you can build a new breed of Windows application with the highly adaptable, Web-like layout engines. Chapter 22 considers how you can build Help and integrate it into your application.