
Несколько представлений одного документа
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Как в SDI сделать несколько представлений для одного документа, чтобы например при клике на команде меню одно представление (например EditView) заменялось другим (например форма) в том же окне? Заранее спасибо всем кто ответит. 

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

Код: Выделить всё
// Примерчик:
/* В меню 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
// Не забыть подключить вьюшки :)
Tviksi, постарайся плз использовать BBCode [ code] (без пробелов) при публикации длинных листингов.
Даже самый дурацкий замысел можно воплотить мастерски
Aik, постараюсь 
