Developers of custom controls must be very aware of how the state of their control is managed. Control users expect controls to retain their state across post-backs, which typically means that a control must use the ViewState mechanism to save and restore its state. It is also possible to manually parse the contents of the POST body if your control's state is propagated that way.
Composite controls are controls that contain other controls as children and are often used to build pieces of a form. You create composite controls by overriding the virtual CreateChildControls method and implementing the tagging interface INamingContainer. Even more useful are user controls, which create composite control definitions from .ascx files, letting you lay out your composite control with a designer.
The last step in building a user-friendly control is to ensure that it integrates cleanly with the Visual Studio .NET designer. Controls can specify what their Toolbox bitmap should look like, how their tags should appear when placed on a page, how to edit their properties, and what the control should look like in design mode.