Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > OnWindowNew()


Автор: GetProcAddress 17.4.2013, 08:54
Пытаюсь создать в MDI еще одно окно для вида с помощью CMDIFrameWnd::OnWindowNew(), получается копия уже созданного окна,  а мне нужно во втором окне получить другой  вид. Подскажите, где мне можно подменить или поменять класс вида подключенный к окну.

Автор: Earnest 18.4.2013, 16:41
Тогда тебе нужен другой шаблон (CMultiDocTemplate), со своими фреймом-видом-документом. Это проще всего. И скажи ему создать новый фрейм: 
CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);

Автор: GetProcAddress 19.4.2013, 00:19
Нее, это по моему немножко не то. Я пробовал
 CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild); 
получаю копию своего вида, попробовал переопределить этот метод, но не пошло....запутался в  pActiveChild , есть возможность переделать его, но у меня не получилось.
Мне нужен один документ и много видов(примерно 20), в четырех окнах, причем разных, одно со сплиттером и два с табконтролами. Я прочитал ваши советы здесь http://forum.vingrad.ru/forum/topic-88243/unread-1.html, немного побродил по MFC . У меня гибрид не заю чего с чем, в начале я создаю пустое окно MDI:
Код

BOOL CNinaDbg::InitInstance()
{
    // TODO: выполните здесь индивидуальную инициализацию потоков
    // создайте главное окно фрейма MDI
    Fileini();
    CMayFrame* pMayFrame = new CMayFrame;
    if (!pMayFrame || !pMayFrame->LoadFrame(IDR_MAINFRAME))
    {
        delete pMayFrame;
        return FALSE;
    }
    m_pMainWnd = pMayFrame;
    //p_hWnd=pMayFrame->GetSafeHwnd();
    pMayFrame->ShowWindow(m_nCmdShow);
    pMayFrame->UpdateWindow();
    return TRUE;
}



затем по кнопке "Открыть":
Код

void CNinaDbg::OnFileOpen()
{
    // TODO: добавьте свой код обработчика команд
    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(IDR_NinaDbgTYPE,
        RUNTIME_CLASS(CNinaDoc),
        RUNTIME_CLASS(CChildFrame),        // Дизассм
        RUNTIME_CLASS(CDisasmView));
    AddDocTemplate(pDocTemplate);
    CWinApp::OnFileOpen();
       PWinThread=AfxBeginThread(


у меня нормально создается документ и вид, а вот дальше нужно добавить кучу видов к этому документу. Сделал класс, производный от CMultiDocTemplate, переопределил в нем OpenDocumentFile ну и в общем все что сделал за сегодня. Я в правильном направлении иду?

Автор: Earnest 19.4.2013, 10:14
Цитата(GetProcAddress @  19.4.2013,  01:19 Найти цитируемый пост)
Нее, это по моему немножко не то. Я пробовал

Ты пропустил главное: тебе нужен ДРУГОЙ шаблон, с другим видом. 
Его не обязательно регистрировать в приложении (AddDocTemplate), если вызывать руками. 
Если там другой вид, копии текущего получиться никак не может. OpenDocumentFile вряд ли нужно переопределять.
Но посмотреть код MFC смысл имеет, чтобы понять - все что там делается - это CreateNewFrame

Автор: GetProcAddress 19.4.2013, 12:22
Дело в том что другой шаблон создается с указателем на ресурсы, который не проходит проверку в конструкторе, если я делаю ресурсы NULL. При подсовывании левых ресурсов, которые можно использовать в своих целях, например для названия окна, мне нужно гдето что то подкрутить, что я и сделал в производном классе от CMultiDocTemplate. Подсовывать один и тот же идентификатор ресурсов я не вижу смысла, затем при создании нового документа MFC обнуляет старый, чего мне нельзя делать, поэтому я пошел по пути переопределения OpenDocumentFile.
CreateNewFrame(pDocument, pActiveChild) я смотрел, он берет за основу активный вид и документ:
Код

 CMDIChildWnd * pframe =
            ((CMDIFrameWnd *)AfxGetApp()->m_pMainWnd)->MDIGetActive();

      CFrameWnd * pNewFrame =
            m_pCheckViewTemplate->CreateNewFrame(pDoc, NULL);

 если  при втором параметре вместо NULL, передать ему pActiveChild, как где то рекомендуют, то его нужно заполнить руками,а это структура огромная где содержится информаця обо всех трех классах MDI, и как в ней поменять класс вида и фрейма, я не смог, поэтому стал отталкиваться от ID_WINDOW_NEW и вышел на  OpenDocumentFile.

Автор: GetProcAddress 19.4.2013, 22:09
Спасибо Earnest. 
Все таки пришел к CreateNewFrame (). Застопорился из за ерунды, почемуто мастер классов один фрейм создал :
DECLARE_DYNCREATE 
а второй:
DECLARE_DYNAMIC
в результате одно окно не создавалось, теперь все работает, вот что получилось:
Код

void CNinaDbg::OnFileOpen()
{
    // TODO: добавьте свой код обработчика команд
    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,
        RUNTIME_CLASS(CNinaDoc),
        RUNTIME_CLASS(CDisasmWnd),        // окно Дизассма
        RUNTIME_CLASS(CDisasmView));
    AddDocTemplate(pDocTemplate);
    CWinApp::OnFileOpen();

    pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,
        RUNTIME_CLASS(CNinaDoc),
        RUNTIME_CLASS(CRegistrsWnd),        // окно регистров процессора и стека
        RUNTIME_CLASS(CRegistrsView));
    CMDIChildWnd * pChild =((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();
    CDocument* pDocument=pChild->GetActiveDocument();
    CFrameWnd* pFrame=pDocTemplate->CreateNewFrame(pDocument,NULL);
    pDocTemplate->InitialUpdateFrame(pFrame, pDocument, TRUE);
    //PWinThread=AfxBeginThre

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)