Figure 1: Visual InterDev 6 Option Dialog
Overview
Many of Microsoft’s development products are beginning to go away from the tabbed dialog metaphor and
have started using a single dialog with a treeview control that is used to
display application options in a hierarchical fashion.
Figure 1 (above) shows the Options dialog in Visual InterDev 6, but other development
products, such as the new Visual Studio.NET are also following suit.
Therefore, in order to make this new UI a little bit easier, I have created a new class called COptionsTree. Using
this class is extremely easy and requires only the following steps:
- Place a tree control on the dialog
- Place the different controls on the dialog that will constitute your options. Make sure and turn the
Visible property off for each of these controls. - Declare a member variable of type COptionsTree in the dialog class
- In the dialog’s OnInitDialog member function, call SubClasDlgItem with the resource id of the tree control.
This will allow my class to subclass the tree control. - Use COptionsTree::AddControl member function to associate each control with a specific tree item. There’s
an example of how to do this below.
Example Source Code
Included with this article is a demo that when run looks like the following:
Figure 2: Demo application – notice how the controls automatically
display/hide based on which item in the treeview control is selected.
In this demo, we have a dialog with two options (First and Second). The First option is associated with a static
control and a radio button. The Second option is associated with a static control, a check box and a combo box.
Below is all the code needed to make this work.
// subclass the treeview with the COptionsTree class m_Tree.SubclassDlgItem(IDC_TREE,this); HTREEITEM hItem, hParentItem; // insert the first item and get it's HTREEITEM hParentItem = m_Tree.InsertItem("First"); // use the HTREEITEM to associate each control with a given tree item m_Tree.AddControl(hParentItem, GetDlgItem(IDC_RADIO)); m_Tree.AddControl(hParentItem, GetDlgItem(IDC_FIRST_STATIC)); // insert the second item (in this example, it's a child of the first hItem = m_Tree.InsertItem("Second",hParentItem); // use the HTREEITEM to associate each control with a given tree item m_Tree.AddControl(hItem,GetDlgItem(IDC_COMBO)); m_Tree.AddControl(hItem,GetDlgItem(IDC_CHECK)); m_Tree.AddControl(hItem, GetDlgItem(IDC_SECOND_STATIC));