Environment: VC6
You can use embedded property sheet in your application. I use “Creating a Property Sheet Inside a Dialog” by Zafir Anjum, as start solution.
1st step.
You must derive class from CPropertyPage and add CPropertySheet member to this class:
class CPropertyPageWithPropertySheet : public CPropertyPage { ... public: virtual BOOL UpdateData(BOOL bSaveAndValidate); virtual void AddPage(CPropertyPage *pPage); ... ... // Implementation protected: CPropertySheet m_internal_sheet; // Generated message map functions //{{AFX_MSG(CPropertyPageWithPropertySheet) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() ... };
2nd step.
Override OnInitDialog() for configure property page and start it Create() method:
BOOL CPropertyPageWithPropertySheet::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here m_internal_sheet.EnableStackedTabs( FALSE ); m_internal_sheet.Create(this, WS_CHILD | WS_VISIBLE , 0); m_internal_sheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT); m_internal_sheet.ModifyStyle( 0, WS_TABSTOP ); // move to left upper corner m_internal_sheet.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
3rd step.
After this you can add property pages to CPropertySheet member. For this I use AddPage() function:
void CPropertyPageWithPropertySheet::AddPage(CPropertyPage *pPage) { m_internal_sheet.AddPage(pPage); }
4th step.
For data exchange and validation you must override UpdateData() function in your dialog class and derived CPropertyPage class:
BOOL CPropertyPageWithPropertySheet::UpdateData(BOOL bSaveAndValidate) { if(!CPropertyPage::UpdateData(bSaveAndValidate)) return FALSE; // check property sheet. Need when OK button pressed in main dialog return m_internal_sheet.GetActivePage()->UpdateData(bSaveAndValidate); }
… and add change to DoDataExchange():
void CPropertyPageWithPropertySheet::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPropertyPageWithPropertySheet) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP // this need for check data when user change tab in parent property sheet if(m_internal_sheet) if(!m_internal_sheet.GetActivePage()->UpdateData(pDX->m_bSaveAndValidate)) pDX->Fail(); }
This code responds for validation, when user changes tabs in parent property sheet.
5th step.
Also you must add calls m_page_with_sheetXX.UpdateData( ) in parent dialog overrided UpdateData() function:
BOOL CPs_in_psDlg::UpdateData(BOOL bSaveAndValidate) { if(!CDialog::UpdateData(bSaveAndValidate)) return FALSE; // check addition property sheet in property pages if(m_page_with_sheet0) if(!m_page_with_sheet0.UpdateData(bSaveAndValidate)) return FALSE; if(m_page_with_sheet1) if(!m_page_with_sheet1.UpdateData(bSaveAndValidate)) return FALSE; // check main property sheet. Need when OK button pressed in main dialog return m_sheet.GetActivePage()->UpdateData(bSaveAndValidate); }