在 MFC 中配置新文档

Posted

技术标签:

【中文标题】在 MFC 中配置新文档【英文标题】:Configuring new document in MFC 【发布时间】:2009-05-13 14:59:12 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

方法是虚拟的 -> 只需从CSingleDocTemplate 派生CMySingleDocTemplate 并在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 对象。它在 File/Load 和 File/New 操作中重复使用。

然后在创建初始大型机之前第一次调用此函数。您可能不希望在创建框架之前向用户显示对话框。哎哟!这有点复杂: 无需像上面那样在 OpenDocumentFile(NULL) 中弹出 GUI,只需 发布 自定义消息/命令到主框架。然后添加一个处理程序,该处理程序将按顺序弹出 GUI/更新文档/更新视图做出反应。这样,主框架将在 GUI 弹出之前显示,您的用户会更开心。

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

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

【讨论】:

以上是关于在 MFC 中配置新文档的主要内容,如果未能解决你的问题,请参考以下文章

MFC 单文档调用对话框

mfc创建文档视图过程

在 C++ MFC 中使用 EnableMDITabbedGroups 时如何保持文档 Tab 键顺序

如何在 MFC 中支持多种文档类型,例如 MS Office 应用程序或 Visual Studio

MFC单文档应用程序显示图像

没有文档/视图架构的 MFC