A tab-like sheet control







Download Source Code and Examples


To add the sheet control to CChildFrame in a MDI application:

  1. add a new member CSheetsWnd m_wndSheets to CChildFrame class.
  2. override CChildFrame::OnCreateClient, and inside the function call m_wndSheets.Attach(this). From this moment all child windows from CChildFrame are put in sheet the contol, each view with one page.

To add the sheet control to a CDialog:

  1. add a new member CSheetsWnd m_wndSheets to your dialog class.
  2. create n dialogs in resource editor, each with the WS_CHILD style.
  3. declare n dialog members in you dialog. One of these dialogs must be created with WS_VISIBLE style.
  4. overwrite OnInitDialog in your dialog class, and add m_wndSheets.Attach(this).
  5. call the Create function for each dialog declared as a member variable. (m_dlg1.Create(IDD_DIALOG1, this));

Suppose that your dialog contains one button IDOK and a button IDCANCEL. These buttons are children of your dialog. To eliminate the buttons from the pages sheet control you must derive a new class CSheetsDialog, and overwrite GetFirstView(), GetNextView() virtual functions from CSheetsWndas shown below. Of course, the variable type of m_wndSheets must be changed to the new class CSheetDialog.

The class CSheetsWnd could be easily extended with more features. I will try to put more features to this class.

// Declare this struct for store a set of ID's control. 
struct SCtrlID 
{ 
	CMap m_mapCtrlIDs; 
	SCtrlID() 
	{ 
		m_mapCtrlIDs[IDOK] = TRUE; 
		m_mapCtrlIDs[IDCANCEL] = TRUE; 
	}; 

	// Check if ID is in map or not. 
	BOOL Is(UINT id) 
	{ 
	BOOL bValue = TRUE; 
	return m_mapCtrlIDs.Lookup(id, bValue); 
	} 
 }; 

 // class CSheetsDialog header 
 class CSheetsDialog : public CSheetsWnd 
 { 
 public: 
	 CSheetsDialog(); 
	virtual ~CSheetsDialog(); 
	virtual CWnd* GetNextView(); 
	virtual CWnd* GetFirstView(); 

 private: 
	CWnd* GetNextViewValid(CWnd* pWnd); 
	static SCtrlID m_ctrlID; 
 }; 

 // class CSheetsDialog implementation 
 SCtrlID CSheetsDialog::m_ctrlID; 

 CSheetsDialog::CSheetsDialog() 
 { 
 } 

 CSheetsDialog::~CSheetsDialog() 
 { 
 } 

 CWnd* CSheetsDialog::GetFirstView() 
 { 
	return GetNextViewValid(CSheetsWnd::GetFirstView()); 
 } 

 CWnd* CSheetsDialog::GetNextView() 
 { 
	return GetNextViewValid(CSheetsWnd::GetNextView());; 
 } 

 // Scan if ID of pWnd is not in IDOK or IDCANCEL 
 CWnd* CSheetsDialog::GetNextViewValid(CWnd * pWnd) 
 { 
	while (pWnd && (m_ctrlID.Is(pWnd->GetDlgCtrlID()))) 
		pWnd = CSheetsWnd::GetNextView(); 
	return pWnd; 
 } 

Last updated: 12 August 1998



Comments

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Intelligent N+X Redundancy, Placement Affinities, & Future Proofing in the Virtualized Data Center Virtualization brought about the ability to simplify business continuity management in IT. Workload portability and data replication capabilities mean that physical infrastructure failures no longer need impact application services, and they can rapidly be recovered even in the event of complete site failure. However, Enterprises and Service Providers face new challenges ensuring they have enough compute …

  • On-demand Event Event Date: January 7, 2015 The Flash Visionary Chat series of webinars brings together IT and business leaders as well as thought leading industry analysts to discuss how the flash revolution is eradicating inefficiency, unleashing innovation, and accelerating businesses. Join us for this episode where we are excited to host not only the 451 Research, who share their recent industry research, but also one of our top customers, who will share their perspective on the disruptive power of flash …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date