Mfc несколько окон одного и того же документа - PullRequest
1 голос
/ 13 декабря 2011

У меня есть приложение SDI MFC, класс CMainFrame которого является производным от CFrameWndEx. Приложение использует шаблон CSingleDocument для подключения Document / View / Frame.

Мне нужно другое окно с содержимым представления, относящимся к тому же документу представления главного окна. Правильно ли иметь другой экземпляр CMainFrame в качестве вторичного окна?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

После некоторых подходов я пришел к решению:

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);

для полученияокно видно.

0 голосов
/ 13 декабря 2011

Рассматривали ли вы добавление дополнительного CView в окно splitter ? Эта SO тема охватывает ее и содержит ссылки на детали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...