
Introduction
I have an SDI (Single Document Interface) application with several views. I had to do the switching between the views with a tab control but I didn’t find anywhere an example for this. I found Christian Rodemeyer’s CMDITabs and it took me half an hour to modify it into this class. I also liked Dany Cantin’s CTrueColorToolBar and from that class I used the method that does the true color bitmaps (SetTrueColorTabs). So there you have it: you can have several views and switch between them without using CpropertySheet or something else..
How to use
It’s very easy to use. You don’t have to change anything in your application architecture. You have to add SDITrueColorTabs.h and SDITrueColorTabs.cpp to your project. In your CmainFrame class add a new member m_wndSDITabs of class CSDITrueColorTabs (don’t forget to include SDITrueColorTabs.h).
class CMainFrame : public CMDIFrameWnd
{
[...]
CSDITrueColorTabs m_wndSDITabs;
virtual void OnUpdateFrameTitle(BOOL bAddToTitle);
[...]
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
[...]
m_wndTabs.Create(this,MT_TOP | MT_IMAGES);
m_wndTabs.ViewsList.AddTail(m_pView1);
m_wndTabs.ViewsList.AddTail(m_pView2);
m_wndTabs.TextLabels.AddTail("Contacte");
m_wndTabs.TextLabels.AddTail("Informatii");
m_wndTabs.LoadTrueColorTabs(26,IDB_TABS_ICONS);
return 0;
}
void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
{
CFrameWnd::OnUpdateFrameTitle(bAddToTitle);
m_wndSDITabs.Update();
}
m_pView1 and m_pView2 are pointers to your views.
The method SwitchView(viewNo) used to switch between the views is declared in my app.cpp and it looks like this:
CView* CtestApp::SwitchView(int viewNo)
{
CView* pActiveView =
((CFrameWnd*) m_pMainWnd)->GetActiveView();
CView* pNewView= NULL;
if ((viewNo == 1 && pActiveView == m_pView1) ||
(viewNo == 2 && pActiveView == m_pView2)) {
return pNewView;
} else {
switch (viewNo) {
case 1:
pNewView = m_pView1;
break;
case 2:
pNewView = m_pView2;
break;
}
#ifndef _WIN32
UINT temp = ::GetWindowWord(pActiveView->m_hWnd, GWW_ID);
::SetWindowWord(pActiveView->m_hWnd, GWW_ID,
::GetWindowWord(pNewView->m_hWnd, GWW_ID));
::SetWindowWord(pNewView->m_hWnd, GWW_ID, temp);
#else
UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
::SetWindowLong(pActiveView->m_hWnd, GWL_ID,
::GetWindowLong(pNewView->m_hWnd, GWL_ID));
::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
#endif
pActiveView->ShowWindow(SW_HIDE);
pNewView->ShowWindow(SW_SHOW);
((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);
((CFrameWnd*) m_pMainWnd)->RecalcLayout();
pNewView->Invalidate();
return pActiveView;
}
}
For more information read CTrueColorToolBar and CMDITabs.
Have fun!