Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OnWindowNew() 
V
    Опции темы
GetProcAddress
Дата 17.4.2013, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.1.2010

Репутация: нет
Всего: нет



Пытаюсь создать в MDI еще одно окно для вида с помощью CMDIFrameWnd::OnWindowNew(), получается копия уже созданного окна,  а мне нужно во втором окне получить другой  вид. Подскажите, где мне можно подменить или поменять класс вида подключенный к окну.
PM MAIL   Вверх
Earnest
Дата 18.4.2013, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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


--------------------
...
PM   Вверх
GetProcAddress
Дата 19.4.2013, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.1.2010

Репутация: нет
Всего: нет



Нее, это по моему немножко не то. Я пробовал
 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 ну и в общем все что сделал за сегодня. Я в правильном направлении иду?

Это сообщение отредактировал(а) GetProcAddress - 19.4.2013, 00:26
PM MAIL   Вверх
Earnest
Дата 19.4.2013, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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


--------------------
...
PM   Вверх
GetProcAddress
Дата 19.4.2013, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.1.2010

Репутация: нет
Всего: нет



Дело в том что другой шаблон создается с указателем на ресурсы, который не проходит проверку в конструкторе, если я делаю ресурсы 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.
PM MAIL   Вверх
GetProcAddress
Дата 19.4.2013, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.1.2010

Репутация: нет
Всего: нет



Спасибо 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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1049 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.