Demo Program
The CMNCTRLS demo program shows how to use every common control. You can get this program from the online help by searching for CMNCTRLS. Copy, compile, and run this program. This document refers to the standard, and Common controls.

Basic Guidelines for Adding Controls

Adding a control at design time
Almost all controls can be added to a form (like a CFormView or CDialog) using the resource editor. The normal tool pallete that appears has the standard Windows controls (Edit Box, Button, ListBox, etc.), and the earlier Common Controls (Sliders, Tree, List, etc.). Some of the newer Common Controls are available in the COMCTxxx.OCX file, such as the Animation Control.

In order to use the newer Common Controls, you will need to add the OCX to your project. You do this by doing the following:

  1. Open your project
  2. Click the Project menu choice
  3. Click the Add To Project... menu choice
  4. Click the Components and Controls menu choice. A dialog will appear.
  5. In the Components and Controls Gallery dialog, cdouble-click Registered ActiveX Controls.
  6. You can now select the desired control to add. Click OK to any further prompts.
  7. You will now see the new control appear in your tool pallete. Drop it on your form like usual.

Adding a control at runtime
While it's more work, you can also add controls at run time, rather than design time. The basic steps involded in doing this are:

  1. Create a data member for your form, that is the MFC class for the desired control.
    (For example, CAnimateCtrl for the animated control)
  2. Call the Create function for the data member in OnInitDialog if it's in a dialog, or OnCreate if it's in a form

Each control class has it's own unique Create syntax.

Responding to events from the control
Once a control is on your form, you can use ClassWizard to have the dialog or form respond to events/messages that the child sends to it's parent (the dialog or form). In order to do this, go to ClassWizard, and select the MessageMap tab, then:

  1. Make sure that the class for the dialog/form is selected in ClassName combobox
  2. Make sure that the ID for the desired control is selected in the Object IDs list
  3. Highlight the desired event in the Messages list (this changes for each control type)
  4. Click the Add Function button.
  5. Verify the new function's name (it helps to assign a good anme to the control before starting), and click OK.

The new function will now be called whenever the child sends that message to the parent dialog/form. A typical example here, is to handle the BN_CLICKED message for a button control.

If you look at the BEGIN_MESSAGE_MAP list, you will note how VC++ implements the message map to call the function when needed. There is also a more dynamic method of handling child messages by modifying this message map manually, but this option is seldomly needed. See ON_COMMAND and ON_COMMAND_RANGE in your help files for more information.

Interacting with the control

In order to interact with the control, you will want to have an MFC object that is attached to it. The type of interaction, again, depends on the control type. For example, you might want to place text into an edit box, or get the current value of a slider control, or hide a particular check box item.

There are two ways to get an MFC class for a control, at design-time with ClassWizard, or runtime with GetDlgItem.

Design Time with ClassWizard
In order to create an MFC class object for a control at design time, go to ClassWizard, then:

  1. Select the Member Variables tab.
  2. Make sure the dialog/form class is highlighted in ClassName
  3. Highlight the desired control in the Control IDs list
  4. Click the Add Variable button.
  5. In the next dialog that appears, enter a good Member Variable Name for the object.
  6. In the Category section, make sure the Control is highlighted. *
  7. In Variable Type, make sure the MFC class type you want for the control is selected.
  8. Click OK.

* - The Category type permits you to select between two types of categories: Value or Control. If you select Value, then the variable will be a simple data class, capable of holding the value for the control. The Control category however, is a more complex class that not only permits you to interact with the value of the control, but also provides more flexibility in manipulating the control itself. For example, a Value category for an edit box will be a CString, that you can get or set, but a Control category will be a CEdit class, permitting you to (in addition) move, hide, or resize the edit control itself.

Runtime with GetDlgItem
The method above permits you to associate an MFC object with a control without writting any code. But, you can also save memory space (although, very little), by creating the control at runtime. To do this, you can use the GetDlgItem function, and type-cast it's return value to the appropriate type. For example:

CEdit* pEdit = (CEdit*) GetDlgItem( IDC_FIRSTNAME);

Since GetDlgItem returns a CWnd*, you can use any of the CWnd functions without a typecast, like:
GetDlgItem( IDC_FIRSTNAME)->SetWindowText("");


The Controls
 Control MFC  Class  Description
 animation  CAnimateCtrl Displays successive frames of an AVI video clip. AVI plays in seperate thread, and can be loaded from resource or a seperate file.
 button  CButton Pushbuttons; also used for check boxes, radio buttons, and group boxes
 combo box  CComboBox Combination of an edit box and a list box. Also has a style where user an not type in edit box.
 edit box  CEdit Boxes for entering text
 header  CHeaderCtrl Button that appears above a column of text; controls width of text displayed
 hotkey  CHotKeyCtrl Invisible window that enables user to create a "hot key" to perform an action quickly
 image list  CImageList Collection of images used to manage large sets of icons or bitmaps (image list isn't really a control; it supports lists used by other controls)
 list  CListCtrl Window that displays a list of text with icons. The appearance has several varions, such as snaking columns or columnar, but not used for reports.
 list box  CListBox Box that contains a list of strings
 progress  CProgressCtrl Window that indicates progress of a long operation
 rich edit  CRichEditCtrl Window in which user can edit with character and paragraph formatting (see Classes Related to Rich Edit Controls). The CRichEditView class is a view whose single, main control is a CRichEdit.
 scroll bar  CScrollBar Scroll bar used as a control inside a dialog box (not on a window). Scrollbars can be added to a window as a style option.
 slider  CSliderCtrl Window containing a slider control with optional tick marks
spin button  CSpinButtonCtrl Pair of arrow buttons user can click to increment or decrement a value
 static-text  CStatic Text for labeling other controls. To create a variable for a static control, you must change it's ID from the default of IDC_STATIC. Static controls can contain bitmaps as well as text.
 status bar  CStatusBarCtrl Window for displaying status information, similar to MFC class CStatusBar. AppWizard will normally add one of these to your new projects.
 tab  CTabCtrl Analogous to the dividers in a notebook; used in "tab dialog boxes" or property sheets
 toolbar  CToolBarCtrl Window with command-generating buttons, similar to MFC class CToolBar. AppWizard will normally add one of these to your new projects.
 tool tip  CToolTipCtrl Small pop-up window that describes purpose of a toolbar button or other tool
 tree  CTreeCtrl Window that displays a hierarchical list of items.