In addition to the normal options (which you can apply to all COM objects), the ATL Object Wizard gives you several options specific to control creation. First, the ATL Object Wizard lets you subclass your control from a regular control (such as a button control or an edit control). You can specify other options for your control—make the control opaque, give it a solid background, render it invisible at run time, make it act like a button, and so on. In this section, we give you a rundown of the options available in the control's property pages. Figure 10-1 shows the control options available through the ATL Object Wizard's Miscellaneous property page.
Figure 10-1. The ATL Object Wizard's Miscellaneous property page.
Here's a description of each option:
- Opaque and Solid Background If you want to be sure that none of the container shows behind the control boundaries, select the Opaque checkbox to render your control completely opaque. Choosing this option sets the VIEWSTATUS_OPAQUE bit so that IViewObjectExImpl::GetViewStatus indicates an opaque control to the container. You can also specify a solid background for your control. The Solid Background option sets the VIEWSTATUS_SOLIDBKGND bit so that GetViewStatus indicates the control has a solid background.
- Add Control Based On Choose this option to cause your control to subclass from one of the standard window classes. The drop-down list contains window class names defined by Windows. When you choose one of these names, the wizard adds a CContainedWindow member variable to your control's class. CContainedWindow::Create will superclass the window class you specify.
- Invisible At Runtime Choose this option to make your control invisible at run time. You can use invisible controls to perform operations in the background, such as firing events at timed intervals. Picking this option causes the control to flip the OLEMISC_INVISIBLEATRUNTIME bit when it places entries in the Registry.
- Acts Like Button Choose this option to enable your control to act like a button. In this case, the control will display itself as the default button based on the value of the container's ambient property DisplayAsDefault. If the control's site is marked as a default button, the control draws itself with a thicker frame. Selecting this option causes the control to flip the OLEMISC_ACTSLIKEBUTTON bit when it places entries in the Registry.
- Acts Like Label Choose this option to enable your control to replace the container's native label. Picking this option causes the control to mark the OLEMISC_ACTSLIKELABEL bit when it places entries in the Registry.
- Normalize DC Choose this option to have your control create a normalized device context when it is called to draw itself. This standardizes the control's appearance but is less efficient than the standard drawing method. This option generates code to override the OnDrawAdvanced method (instead of the normal OnDraw method).
- Insertable Choose this option to have your control appear in the Insert Object dialog box of applications such as Microsoft Word and Microsoft Excel. Your control can then be inserted by any application that supports embedded objects through the Insert Object dialog box. Choosing this option adds the Insertable key as part of the control's Registry entries.
- Windowed Only Choose this option to force your control to be windowed, even in containers that support windowless objects. If you don't select this option, your control will automatically be windowless in containers that support windowless objects and will automatically be windowed in containers that don't support windowless objects. Choosing this option causes the Object Wizard to generate code to set the flag CComControlBase::m_bWindowOnly to TRUE in the constructor. ATL uses this flag to decide whether to query for the container's IOleInPlaceSiteWindowless interface during activation.
You can also decide on your object's stock properties up front. In the Stock Properties page, select the stock properties you want the object to support, such as Caption or Border Color. You can select all the stock properties at once by clicking the >> button. This adds properties to the control's property map.
After you run the ATL COM AppWizard and the Object Wizard, you get a DLL replete with all the hooks necessary to be a COM DLL. The well-known exports that the control exposes include DllGetClassObject, DllCanUnloadNow, DllRegisterServer, and DllUnregisterServer. In addition, you get an object that satisfies the main requirements of COM, including a main incoming interface and a class object.
Once you've started a project using one of the wizards, your next step is to get the control to do something interesting. Let's look at an ActiveX control that actually does some real work.