Страница 1 из 1

Несколько представлений одного документа

Добавлено: 13 мар 2005, 14:24
Nadi
Как в SDI сделать несколько представлений для одного документа, чтобы например при клике на команде меню одно представление (например EditView) заменялось другим (например форма) в том же окне? Заранее спасибо всем кто ответит. :)

Добавлено: 14 мар 2005, 14:16
Romeo
При клике создать новый View, а старый закрыть. Создастся видимость того, что изменения произошли в текущем окне.

Добавлено: 14 мар 2005, 21:49
Tviksi
Описывать долго, если есть желание напишите мне свой адрес я пришлю примерчик :)

Добавлено: 18 мар 2005, 01:05
Tviksi

Код: Выделить всё

// Примерчик:

/* В меню Edit перечисленны возможные вьюшки, при выборе пункта меню меняем текущую вьюшку: */


BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_COMMAND_RANGE(ID_VIEW_EDITBAR, ID_VIEW_RECORDBAR, OnViewDlgBar)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////

void CMainFrame::OnEdit(UINT ID)
{
	CView* pOldActiveView = GetActiveView();
	CView* pNewActiveView = (CView*)GetDlgItem(ID);

	if(pNewActiveView == NULL)
	{
		switch(ID)
		{
		case ID_EDIT_DEVELOPER:
			pNewActiveView = (CView*)new CDeveloperView;
			break;
		case ID_EDIT_ERROR:
			pNewActiveView = (CView*)new CErrorView;
			break;
		case ID_EDIT_MSG:
			pNewActiveView = (CView*)new CMsgView;
			break;
		case ID_EDIT_PLAN:
			pNewActiveView = (CView*)new CPlanView;
			break;
		case ID_EDIT_QUESTION:
			pNewActiveView = (CView*)new CQuestionView;
			break;
		case ID_EDIT_VERSION:
			pNewActiveView = (CView*)new CVersionView;
			break;
		}
		CCreateContext context;
		context.m_pCurrentDoc = pOldActiveView->GetDocument();
		pNewActiveView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CFrameWnd::rectDefault, this, ID, &context);
		pNewActiveView->OnInitialUpdate();
	}

	SetActiveView(pNewActiveView);
	pNewActiveView->ShowWindow(SW_SHOW);
	pOldActiveView->ShowWindow(SW_HIDE);

	if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CDeveloperView))
		pOldActiveView->SetDlgCtrlID(ID_EDIT_DEVELOPER);	
	if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CErrorView))
		pOldActiveView->SetDlgCtrlID(ID_EDIT_ERROR);
	if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CMsgView))
		pOldActiveView->SetDlgCtrlID(ID_EDIT_MSG);
	if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CPlanView))
		pOldActiveView->SetDlgCtrlID(ID_EDIT_PLAN);
	if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CQuestionView))
		pOldActiveView->SetDlgCtrlID(ID_EDIT_QUESTION);
	if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CVersionView))
		pOldActiveView->SetDlgCtrlID(ID_EDIT_VERSION);
	
	pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
	RecalcLayout();
}

////////////////////////////////////////////////////////////////////////////
// Кстати, обработка меню у меня происходит в CMainFrame
// Не забыть подключить вьюшки :)

Добавлено: 18 мар 2005, 02:31
AiK
Tviksi, постарайся плз использовать BBCode [ code] (без пробелов) при публикации длинных листингов.

Добавлено: 18 мар 2005, 03:12
Tviksi
Aik, постараюсь :)