Re: CFrameWnd, CSplitterWnd, CView
asterisc wrote:
There are two ways to switch views in SDI:
1. Create and destroy
2. Show and hide
How can i show-hide a splitter? (not by makeing one pane size = 0!)
If the splitter is in the CMainFrame, there is no option to
destory-create, because it must be created on the: OnCreateClient()
function of the CMainFrame.
Can you please be more specific?
asterisc:
View/spiltters do not "have" to be created in OnCreateClient(). Only the
initially displayed view/splitter needs to be.
But, really, show/hide is the easier way to go. In this case you do
create all the views/splitters in OnCreateClient(). The initially
displayed view/splitter should have the id AFX_IDW_PANE_FIRST, and the
others AFX_IDW_PANE_FIRST+1, etc.
This is the code I use to switch between views or splitters (it makes no
difference which):
int CMainFrame::SetClient(int nNew)
{
// select new active client (view or splitter)
// returns previous index
// m_pViewWnd is an array of CWnd pointers
// m_nClientIndex holds the currently selected index
int nOld=m_nClientIndex;
if(nNew == nOld)
{
return nOld;
}
CWnd* pOld = m_pViewWnd[nOld];
CWnd* pNew = m_pViewWnd[nNew];
UINT iOld = ::GetWindowLong(pOld->m_hWnd, GWL_ID);
UINT iNew = ::GetWindowLong(pNew->m_hWnd, GWL_ID);
::SetWindowLong(pOld->m_hWnd, GWL_ID, iNew);
::SetWindowLong(pNew->m_hWnd, GWL_ID, iOld);
pOld->ShowWindow(SW_HIDE);
pNew->ShowWindow(SW_SHOW);
m_nClientIndex = nNew;
RecalcLayout();
pNew->Invalidate();
return nOld;
}
In my specific application, there are two clients. Index 0 is a view and
index 1 is a splitter, containing two views. IMO, you can make the whole
thing more OOP correct if you use a derived splitter class that creates
its own views internally, but this is not necesssary.
David Wilkinson