С++ MFC MDI изменяет переменные дочернего окна при создании

У меня есть приложение MDI, в котором диалог вызывается при вызове функции OnFileNew() (обрабатываемой объектом theApp). Этот диалог позволяет пользователю устанавливать значения для некоторых переменных, которые затем необходимо передать объекту CChildFrame, который создается при вызове функции ->CreateNewChild().

Как передать эти переменные в объект CChildFrame, созданный функцией ->CreateNewChild()?

РЕДАКТИРОВАТЬ: В ответ на ответ, который я получил, вот результаты использования ->Create() против ->CreateNewChild().

Ссылка: CMainFrame *pFrame; - pFrame->CreateNewChild()

Ссылка: CChildFrame *childFrame; - childFrame->Create()

Как получить окна с вкладками, показанные в первой ссылке, с объявлениями функций, описанными во второй ссылке?


person Timothy Chapman    schedule 16.05.2013    source источник
comment
А где вопрос?   -  person Jabberwocky    schedule 16.05.2013
comment
Я забыл поставить вопрос в исходном сообщении. Спасибо что подметил это. Отредактировал пост, добавив вопрос.   -  person Timothy Chapman    schedule 16.05.2013


Ответы (1)


Вы можете передавать данные через настраиваемый шаблон документа. Создайте класс, производный от CMultiDocTemplate, чтобы добавить дополнительные элементы данных, а затем добавьте указатель на производный класс шаблона документа в класс приложения, производный от CWinApp. Инициализируйте свой шаблон документа обычным способом, кроме того, когда вы закончите, сохраните новый объект шаблона документа в указатель в вашем классе приложения.

Теперь в вашей функции CreateNewChild вместо вызова CWinApp::OnFileNew вы можете просто получить данные из текущего фрейма, а затем назначить элемент данных в шаблоне документа, сохраненном в классе приложения, перед вызовом OpenDocumentFile(NULL). Вы можете очистить данные-члены, когда OpenDocumentFile вернется.

Шаблон документа, в свою очередь, создаст дочерний фрейм и передаст шаблон документа в контексте создания. Чтобы получить контекст создания в дочернем фрейме, вы можете либо переопределить CChildFrame::OnCreateClient, либо прочитать структуру создания в OnCreate:

MDICREATESTRUCT * pMDICreateStruct=(MDICREATESTRUCT * )lpCreateStruct->lpCreateParams;
CCreateContext *pCreateContext=(CCreateContext *)pMDICreateStruct->lParam;

Вместо передачи данных инициализации в шаблоне документа вы также можете передать данные в новый документ. В основном вы скопируете код из CMultiDocTemplate::OpenDocumentFile и добавите код для получения данных инициализации из активного документа основного фрейма.

person Sheng Jiang 蒋晟    schedule 16.05.2013
comment
Есть ли способ сделать это, когда в проекте нет поддержки документов/архитектуры? - person Timothy Chapman; 10.06.2013
comment
Вы можете передать класс, производный от CCreateContext, который содержит исходные данные, собранные в обработчике команды ID_FILE_NEW, в функцию создания дочернего фрейма и использовать контекст создания для заполнения вашего дочернего фрейма в OnCreate. - person Sheng Jiang 蒋晟; 10.06.2013