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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Nadi
Сообщения: 1
Зарегистрирован: 13 мар 2005, 14:12

Как в SDI сделать несколько представлений для одного документа, чтобы например при клике на команде меню одно представление (например EditView) заменялось другим (например форма) в том же окне? Заранее спасибо всем кто ответит. :)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

При клике создать новый View, а старый закрыть. Создастся видимость того, что изменения произошли в текущем окне.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Tviksi
Сообщения: 9
Зарегистрирован: 14 мар 2005, 21:44
Откуда: Киев
Контактная информация:

Описывать долго, если есть желание напишите мне свой адрес я пришлю примерчик :)
Tviksi
Сообщения: 9
Зарегистрирован: 14 мар 2005, 21:44
Откуда: Киев
Контактная информация:

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

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

/* В меню 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
// Не забыть подключить вьюшки :)
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Tviksi, постарайся плз использовать BBCode [ code] (без пробелов) при публикации длинных листингов.
Даже самый дурацкий замысел можно воплотить мастерски
Tviksi
Сообщения: 9
Зарегистрирован: 14 мар 2005, 21:44
Откуда: Киев
Контактная информация:

Aik, постараюсь :)
Ответить