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