Вы правы, класс документов не подходит для пользовательского интерфейса.
CDocTemplate::[OpenDocumentFile][1](pszPath)
выглядит как лучший кандидат:
pszPath == NULL означает «создать новый документ».
Метод является виртуальным -> Просто извлеките CMySingleDocTemplate
из CSingleDocTemplate
и используйте экземпляр этого класса в CMyWinApp::InitInstance().
Этот класс отвечает за создание документов, фреймов и представлений, поэтому я считаю, что это хорошее место для выполнения операции пользовательского интерфейса.
BOOL CMyWinApp::InitInstance()
{
...
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CMySingleDocTemplate( // <--Derives from CSingleDocTemplate
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
...
}
CDocument* CMySingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
BOOL bMakeVisible)
{
CDocument *pDoc =
CSingleDocTemplate::OpenDocumentFile(lpszPathName, bMakeVisible);
if (lpszPathName==NULL)
{
// GUI to get user info
// update doc
m_pOnlyDoc->Blah(input);
// update view
m_pOnlyDoc->UpdateAllViews(NULL,...,...);
}
}
Это не может быть идеальным, хотя: в SDI есть один и только объект документа. Он повторно используется в файлах / загрузках и файлах / новых операциях.
Эта функция будет вызываться в первый раз до создания исходного мэйнфрейма. Возможно, вы не захотите, чтобы диалоговое окно предоставлялось пользователю до создания кадра. Ой! Это немного сложнее:
Вместо отображения GUI в OpenDocumentFile (NULL), как указано выше, просто отправьте пользовательское сообщение / команду в основной фрейм. Затем добавьте обработчик, который будет реагировать на всплывающие окна GUI / update doc / update views. Таким образом, основной кадр будет отображаться до появления GUI, и ваш пользователь будет счастливее.
Это также решает вашу проблему, когда у вас нет родителя CWnd: основной фрейм уже создан, и ваш диалог будет использовать его по умолчанию.
Кстати, другое решение состоит в добавлении обработчика команды для ID_FILE_NEW в карту сообщений вашего CMyWinApp и добавлении собственного переопределения OnFileNew (). Но когда вы пишете OnFileNew (), я полагаю, вы быстро обнаружите, что это уродливое решение: - (