15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Multiple dialog templates in a Form View

tcatchick@aesprodata.com.au
Wednesday, December 18, 1996


     Environment: VC++ 1.52, Win3.1, Win95.
     
     Peoples,
     
     I am creating an application, which has a splitter window. One side 
     uses a tree class display (ie like Windows program manager) and on the 
     other side being blank.
     
     When the operator double clicks on one of the tree's leaves I would 
     like to display in the blank form area the dialog associated with this 
     leaf.
     
     Is there a way I can provide this heterogeneous behaviour to a 
     FormView class???
     
     Thanks In advance.
     
     Theron.C.



Michael -- Michael.Dunphy@HBC.honeywell.com
Thursday, December 19, 1996

 Subject: Multiple dialog templates in a Form View
 Environment: VC++ 1.52, Win3.1, Win95.

See Knowledgebase Article Q102827
("Replacing a View in a Splitter Window")

 - Michael Dunphy

          Peoples,
          I am creating an application, which has a splitter window. One   
side
          uses a tree class display (ie like Windows program manager) and   
on the
          other side being blank.

          When the operator double clicks on one of the tree's leaves I   
would
          like to display in the blank form area the dialog associated   
with this leaf.
          Is there a way I can provide this heterogeneous behaviour to a
          FormView class???
          Thanks In advance.
          Theron.C.




Peter -- cpudude@mem.net
Friday, December 20, 1996

[Mini-digest: 2 responses]

tcatchick@aesprodata.com.au wrote:
> 
>      Environment: VC++ 1.52, Win3.1, Win95.
> 
>      Peoples,
> 
>      I am creating an application, which has a splitter window. One side
>      uses a tree class display (ie like Windows program manager) and on the
>      other side being blank.
> 
>      When the operator double clicks on one of the tree's leaves I would
>      like to display in the blank form area the dialog associated with this
>      leaf.
> 
>      Is there a way I can provide this heterogeneous behaviour to a
>      FormView class???
> 
>      Thanks In advance.
> 
>      Theron.C.

I have written a sub-set of the CTreeCtrl that does just about what you
are
looking for, however, I have not implemented it as a true splitter
window, 
but simply as a "list-box" on the left side of the window and then I
load
views into the right side of the window.  If you'd like to see it, email
me
and I'll send it to you!!  NB: I said it is a subset and I haven't fully
tested/debugged it, but if you still want it we could share the testing
efforts!!

Peter R. Vermilye
cpudude@mem.net

PS: Who does Microsoft call for help?

-----From: Jacques de Broin 

To change the View displayed by a splitter window, I made a function
called ShowFormView
by copying the code in CSplitterWnd::DeleteView CSplitterWnd::CreateView
from WinSplit.cpp.

When I want to change the view, I simply call this with the
CRuntimeClass of the new view.

void CMainFrame::ShowFormView(CRuntimeClass* pViewClass) 
{
	int row = 1;
	int col = 0;
	SIZE sizeInit = CSize(100,100);
	CCreateContext* pContext = NULL;

	CWnd* pPane = m_wndSplitterForm.GetPane(row, col);
	ASSERT_KINDOF(CView, pPane);
	BOOL bWasActivePane = FALSE;
	if (m_wndSplitterForm.GetActivePane() == pPane)
	{
		bWasActivePane = TRUE;
	}

	// default implementation assumes view will auto delete in
PostNcDestroy
	pPane->DestroyWindow();

	CCreateContext contextT;

	if(pContext == NULL)
	{
		// if no context specified, generate one from the currently selected
		//  client if possible
		CView* pOldView = (CView*)m_wndSplitterForm.GetActivePane();
		if (pOldView != NULL && pOldView->IsKindOf(RUNTIME_CLASS(CView)))
		{
			// set info about last pane
			ASSERT(contextT.m_pCurrentFrame == NULL);
			contextT.m_pLastView = pOldView;
			contextT.m_pCurrentDoc = pOldView->GetDocument();
			if (contextT.m_pCurrentDoc != NULL)
				contextT.m_pNewDocTemplate =
				  contextT.m_pCurrentDoc->GetDocTemplate();
		}
		pContext = &contextT;
	}

	CView* pFormView;
	TRY
	{
		pFormView = (CView*)pViewClass->CreateObject();
		if (pFormView == NULL)
			AfxThrowMemoryException();
	}
	CATCH_ALL(e)
	{
		TRACE0("Out of memory creating a splitter pane.\n");
		// Note: DELETE_EXCEPTION(e) not required
		return;
	}
	END_CATCH_ALL

	ASSERT_KINDOF(CView, pFormView);
	ASSERT(pFormView->m_hWnd == NULL);       // not yet created

	DWORD dwStyle = AFX_WS_DEFAULT_VIEW;

	// TODO: Test on Win95
	DWORD dwVersion = ::GetVersion();
	BOOL bWin4 = (BYTE)dwVersion >= 4;
	if (bWin4)
		dwStyle &= ~WS_BORDER;

	// Create with the right size (wrong position)
	CRect rect(CPoint(0,0), sizeInit);
	if (!pFormView->Create(NULL, NULL, dwStyle,
		rect, &m_wndSplitterForm, m_wndSplitterForm.IdFromRowCol(row, col),
pContext))
	{
		TRACE0("Warning: couldn't create client pane for splitter.\n");
			// pFormView will be cleaned up by PostNcDestroy
//		return FALSE;
	}
//	ASSERT((int)_AfxGetDlgCtrlID(pFormView->m_hWnd) ==
m_wndSplitter.IdFromRowCol(row, col));
		
	pFormView->OnInitialUpdate();

	m_wndSplitterForm.RecalcLayout();

//	m_wndSplitterForm.SetRedraw(TRUE);	

//	m_wndSplitterForm.RedrawWindow();

	if(bWasActivePane)
		SetActiveView(pFormView);
}




| Вернуться в корень Архива |