Introduction
I needed a tab control that would allow me to enable and disable certain tab
items, I did a search and came across the Paul Dilascia
CTabCtrlWithDisable
article. This was exactly what I required
except that it was written in MFC. This article basically convert his code to
WTL.
For more infomation on Paul Dilascia original article see here
Requirements
You will require the WTL Libraries, these can be downloaded from the
Microsoft site. There are various articles on the net that tell you how to do
this, so I won't bore you with the details.
How to use the control in your WTL App
- Add the header file atlTabCtrlWithDisable.h to the Dialogs source
code that will be using the control. The control class name is
CTabCtrlWithDisable.
You will also need to add atlmisc.h
in your stdafx.h file.
- You will need to override the base class
CTabCtrlWithDisable
and set the pure virtual function
IsTabEnabled
e.g. class CMyTabCtrlWithDisable : public CTabCtrlWithDisable
{
public:
BOOL IsTabEnabled(int nTab)
{
return (nTab !=2);
}
};
Note - The isTabEnabled
function determines
which Tab gets disabled
More information on the design of this class - see original
article
- Instantiate the class and Subclass the control in the
OnInitDialog
function e.g.
CString sBuff;
m_ctlTab.SubclassDlgItem(IDC_TAB1, *this);
TCITEM item = { 0 };
item.mask = TCIF_TEXT;
sBuff = _T("Tab 1");
item.pszText = sBuff.GetBuffer(sBuff.GetLength());
sBuff.ReleaseBuffer(sBuff.GetLength());
m_ctlTab.InsertItem(0, &item);
sBuff = _T("Tab 2");
item.pszText = sBuff.GetBuffer(sBuff.GetLength());
sBuff.ReleaseBuffer(sBuff.GetLength());
m_ctlTab.InsertItem(1, &item);
sBuff = _T("Tab 3");
item.pszText = sBuff.GetBuffer(sBuff.GetLength());
sBuff.ReleaseBuffer(sBuff.GetLength());
m_ctlTab.InsertItem(2, &item);
sBuff = _T("Tab 4");
item.pszText = sBuff.GetBuffer(sBuff.GetLength());
sBuff.ReleaseBuffer(sBuff.GetLength());
m_ctlTab.InsertItem(2, &item);
sBuff = _T("Tab 5");
item.pszText = sBuff.GetBuffer(sBuff.GetLength());
sBuff.ReleaseBuffer(sBuff.GetLength());
m_ctlTab.InsertItem(2, &item);
m_ctlTab.InitTabStatus();
- Call
InitTabStatus
method. Note the call to
InitTabStatus
, this function is called after inserting the tab
items, and it basically does a check on the status of the tab items to see if
any tab items need disabling.
- Add
REFLECT_NOTIFICATIONS()
to the end of the message map
from your calling class.
That's it!!!
The Demo App shows how to use the control on a WTL dialog class.