После некоторых подходов я пришел к решению:
1st:
В приложении есть два экземпляра CMainFrame, где у второго есть логическое поле, указывающее, что оно одно или другое.Это логическое значение позволило мне пропустить создание вечного творения только на втором, потому что я только хочу, чтобы это был прямоугольник с представлением.Я добавил специальный открытый конструктор CMainFrame, который всегда устанавливает для указанного логического значения значение true.
CMainFrame *pSecondFrame = new CMainFrame(TRUE /*dumb*/);
Это работало, но было очень медленно.Вид первого MainFrame был полностью непригоден из-за недостатка скорости.
2nd:
Имейте CSecondFrame, который также является производным от CFrameWndEx и почти ничего не имеет на своем теле.Поскольку у IDR_MAINFRAME ничего нет, я могу ожидать загрузки LoadFrame (IDR_MAINFRAME) и иметь почти пустой фрейм в приложении.
CSecondFrame *pSecondFrame = new CSecondFrame();
Это сработало, но было очень медленным.Вид первого MainFrame был полностью непригоден из-за его недостаточной скорости.
Для первого и второго подходов мне пришлось добавить новый CreateContext, поскольку я не могу повторно использовать представление мэйнфрейма:
if (!pSecondFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
CMainFrame* pMainFrame=(CMainFrame*)::AfxGetMainWnd();
if (!pMainFrame)
return FALSE;
CMyView* pView=(CMyView*)(pMainFrame->GetActiveView());
if (!pView)
return FALSE;
CCreateContext context;
context.m_pCurrentDoc=pMainFrame->GetActiveDocument();
context.m_pNewViewClass= RUNTIME_CLASS(CMyView);
context.m_pLastView= pView;
context.m_pCurrentFrame = pSecondFrame;
pSecondFrame->CreateView(&context);
3rd:
В начале функции InitInstance у меня есть шаблон документа:
Итак, давайте поиграем с его методом CreateNewFrame: POSITION pos = pDocTemplate-> GetFirstDocPosition ();
//pFrameTemp attribution
CFrameWnd* pSecondFrame= pDocTemplate->CreateNewFrame(pDocTemplate->GetNextDoc(pos),pFrameTemp);
Я пробовал разные вещи для pFrameTemp: NULL, CMainFrame, CSecondFrame.Каждый раз, когда я получаю кадр, который является точной копией основного, и я не хочу этого.
Для случаев CMainFrame и CSecondFrame я попытался подробно описать их функции Create (...), которые не работают, поэтому они даже не передают свой метод OnCreate (...).Вместо этого я также попытался сделать LoadFrame (IDR_MAINFRAME) для обоих случаев.Теперь у меня будет три фрейма: Основной, Второй, который является точной копией основного, и тот, который создан с помощью LoadFrame, который является полностью пустым.Новый фрейм, основанный на фрейме, который есть в шаблоне, а не на том, который передается в его параметре, я решил попробовать создать еще один шаблон:
CSingleDocTemplate* pSecondDocTemplate;
pSecondDocTemplate2 = new CSingleDocTemplate(
MenuID,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CSecondFrame),//only the frame differs
RUNTIME_CLASS(CMyView));
AddDocTemplate(pSecondDocTemplate);
POSITION pos= pDocTemplate->GetFirstDocPosition();
CFrameWnd* pSecondFrame=pSecondDocTemplate->CreateNewFrame(pDocTemplate->GetNextDoc(pos), NULL);
Обратите внимание, что я даю документ первогошаблон как параметр, а не второй, для CreateNewFrame.Это единственное протестированное мной решение, которое работает и не замедляет операции в представлении.
Кажется, мне нужно, чтобы каждое представленное мной решение делало
pSecondFrame->ShowWindow(SW_SHOW);
для полученияокно видно.