Introduction
I first submitted this code and article way back in Feb '99 and Jul '99 on the CodeGuru site. Wow, do the years go by fast! It's still there and going strong,
and I still use the control today in newer projects that I've worked on since the one in whcih the control first turned up in. I've never had a need to change the code so far,
but have decided to re-submit here on CodeProject.
Anyway, a lot of projects that I've working make use of tab controls, and on the tab pages there are typically up to 10 controls! And using the
ON_NOTIFY(TCN_SELCHANGE... )
message, in the parent window becomes painful. 'Why not use property pages?' people ask. Sure that would make things easier, but the pages
on property pages take up the entire parent window and we've got layouts that require any number of controls to not be on a page but around the tab control somewhere. To do that
with property pages requires a bit of painful coding to get things where you want them, and if scaling of the page is involved it's even harder!
The STabCtrl
, although very simple, I've found to be extremely useful. It implements a tab control that automatically handles the showing and hiding of objects
attached to a tab's various pages, eliminating the need to do so via the ON_NOTIFY(TCN_SELCHANGE... )
message in a parent window.
To use the control:
- Simply replace any instance of a
CTabCtrl
with CSTabCtrl
(remember to include the header file STabCtrl.h), initialize it as you would an
MFC CTabCtrl
. - Use the
AttachControlToTab
member to attach you objects to the various available pages. - Use the
SetCurSel
member to programmatically show a tab's particular page.
Note Steps 1, 2 & 3 are typically done in the parent dialogs ::OnInitDialog()
member. Once done, the tab control will show and hide the attached objects
depending on the users tab selection.
class CSomeDialogClass : public CDialog
{
CSTabCtrl m_TabCtrl;
CTreeCtrl m_TreeCtrl;
CListCtrl m_ListCtrl;
CComboBox m_ComboCtrl;
virtual BOOL OnInitDialog();
};
BOOL CSomeDialogClass::OnInitDialog()
{
CDialog::OnInitDialog();
PSTR pszTabItems[] =
{
"Tab Sheet 1 : Tree control",
"Tab Sheet 2 : List control",
"Tab Sheet 3 : Combobox control",
NULL
};
TC_ITEM tcItem;
for(INT i = 0; pszTabItems[i] != NULL; i++)
{
tcItem.mask = TCIF_TEXT;
tcItem.pszText = pszTabItems[i];
tcItem.cchTextMax = strlen(pszTabItems[i]);
m_TabCtrl.InsertItem(i,&tcItem);
}
m_TabCtrl.AttachControlToTab(&m_TreeCtrl,0);
m_TabCtrl.AttachControlToTab(&m_ListCtrl,1);
m_TabCtrl.AttachControlToTab(&m_ComboCtrl,2);
m_TabCtrl.SetCurSel(0);
}
Anyway...hope this is of use to everyone!