在MFC中配置新文档

时间:2009-05-13 14:59:12

标签: mfc

当用户在我的SDI应用程序中创建一个新文档时,我需要提供一个对话框,指定要创建的文档的详细信息(想想:分辨率,位深度等)我最初放置显示此代码的代码OnNewDocument()中的对话框(打开现有文档时我不需要它),但是在文档类中放置用户界面代码感觉不对(同样,我没有任何CWnd *可以用作对话的父母。) 在MFC中有更好的地方吗?

1 个答案:

答案 0 :(得分:2)

你是对的,文档类不是UI的好地方。

CDocTemplate::[OpenDocumentFile][1](pszPath)看起来是一个更好的候选人:

pszPath == NULL表示“创建新文档”。

该方法是虚拟的 - >只需从CMySingleDocTemplate派生CSingleDocTemplate并在CMyWinApp::InitInstance().

中使用此类的实例

此类负责创建文档,框架和视图,因此我认为这是放置UI操作的好地方。

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中,只有一个doc对象。它在文件/加载和文件/新操作中重复使用。

在创建初始主机之前,将首次调用此函数。您可能不希望在创建框架之前向用户显示对话框。哎哟!这有点复杂: 而不是如上所述在OpenDocumentFile(NULL)中弹出GUI,只需发布自定义消息/命令到主框架。然后添加一个处理程序,它将通过序列弹出GUI /更新doc / update视图作出反应。这样,主框架将在弹出GUI之前显示,您的用户会更开心。

这也解决了您没有CWnd父级的问题:主框架已经创建,您的对话框将默认使用它。

BTW,另一个解决方案是在CMyWinApp的消息映射中添加ID_FILE_NEW的命令处理程序,并添加自己的OnFileNew()覆盖。但是当你写OnFileNew()时,我相信你会很快发现它是一个丑陋的解决方案: - (