在 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 中配置新文档的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ MFC 中使用 EnableMDITabbedGroups 时如何保持文档 Tab 键顺序