Приложение с вкладками MFC MDI - хотите добавить окна без документов в группу вкладок

У меня есть приложение MFC MDI, которое я разработал в Visual Studio с интерфейсом с вкладками. Я хотел бы открыть представления в группе вкладок, которые не являются представлениями документов, т.е. у них нет связанного документа, нет необходимости их сохранять и т.д. В некотором смысле они будут вести себя как немодальный диалог, но с вкладками. [Эти окна просто отображают информацию и принимают команды]

Внутренний механизм приложений MDI, кажется, очень ориентирован на работу со структурами объектов DocTemplate - Document - Frame - View вместе с соответствующими окнами.

Q1) У кого-нибудь есть идеи, как создать такие окна и добавить их в уже созданную группу вкладок MDI? Я попытался создать окно RichEdit и добавил его с помощью:

 // m_wndListingView will be a non-editable CRichEditCtrl

 m_wndListingView->Create(WS_CHILD | WS_VISIBLE | ES_WANTRETURN | WS_VSCROLL |
   WS_HSCROLL | ES_MULTILINE | ES_LEFT | ES_AUTOHSCROLL | ES_SAVESEL |ES_READONLY,
   CRect(0, 0, 20, 20), pMainFrame, 1234);

 // get Tab control and add a new tab

 CMFCTabCtrl    *mm_wndTabCtrl = &pMainFrame->GetMDITabs();
 mm_wndTabCtrl->AddTab (m_wndListingView, _T("LISTING"));

Это создало и отобразило окно ... но не было добавлено в группу вкладок.

Q2) Если мне удалось получить окно (возможно, это должно быть окно фрейма), правильно отображаемое в группе вкладок, как мне сообщить «системе», что, когда пользователь закрывает ее, я не хочу, чтобы приложение запрашивало пользователь сохранить документ? Возможно, я смогу перегрузить метод OnClose ... но это не может быть document :: OnClose (), потому что документа нет.

Спасибо за любые идеи, CAS


person Chris S.    schedule 17.02.2011    source источник


Ответы (1)


Вам необходимо создать фрейм и представление, на котором будет размещено ваше расширенное редактирование. Это можно сделать без документа. Представление будет родительским для richedit (а не pMainFrame).

Что-то в этом роде (предупреждение, непроверено):

        CFrame* pFrame = (Crame*)RUNTIME_CLASS( CFrame )->CreateObject();
        CCreateContext context;
        context.m_pNewViewClass = RUNTIME_CLASS( CView );
        context.m_pCurrentDoc = NULL;
        context.m_pCurrentFrame = NULL;
        context.m_pLastView = NULL;
        context.m_pNewDocTemplate = NULL;

        // NOTE: create IDR_SOMERESOURCE string (for tab title), menu, etc as needed
        BOOL frameLoaded = pFrame->LoadFrame( IDR_SOMERESOURCE, WS_OVERLAPPEDWINDOW, pMainFrame, &context );
        if (frameLoaded)
            Frame->InitialUpdateFrame( NULL, TRUE );

           // now create your rich edit with the view as its parent
person Aidan Ryan    schedule 18.02.2011
comment
Я проверю это. [До сих пор я просто использовал один и тот же фрейм с новыми парами документ / представление ... и мне приходилось правильно обрабатывать действия с «документом», такие как OnOpen () и OnClose () ... но это перебор]. Спасибо - person Chris S.; 23.02.2011