Настройка нового документа в MFC - PullRequest
0 голосов
/ 13 мая 2009

Когда пользователь создает новый документ в моем SDI-приложении, мне нужно представить диалоговое окно с указанием деталей создаваемого документа (думаю: разрешение, битовая глубина и т. Д.). Сначала я поместил код для отображения этого диалог в OnNewDocument () (он мне не нужен при открытии существующего документа), но помещать код пользовательского интерфейса в класс документа просто нехорошо (кроме того, у меня нет CWnd * для использования в качестве родитель для диалога).
Есть ли лучшее место для этого в MFC?

1 Ответ

2 голосов
/ 13 мая 2009

Вы правы, класс документов не подходит для пользовательского интерфейса.

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 (), я полагаю, вы быстро обнаружите, что это уродливое решение: - (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...