我有一个使用Doc / View架构的常规MFC应用程序。应用程序启动时,它会自动创建一个空文档的视图。我想在启动时禁用此自动视图,并仅在用户点击"新文档"时显示视图。从文件菜单。
有没有办法这样做?
CMultiDocTemplate* template = new CMultiDocTemplate(IDR_DorlionTYPE,
RUNTIME_CLASS(CDocument),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CView));
if (!CView)
return FALSE;
答案 0 :(得分:3)
标准MFC(向导生成)代码假定您总是希望看到一个新文档,如果该程序只是自己运行(而不是双击数据文件或使用命令行选项运行它)打开文件);在致电ProcessShellCommand()
之前插入以下行以禁用此功能"功能":
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew) // actually none
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
[如果您有兴趣,可以单步执行ParseCommandLine()
的MFC源代码,如果命令行中没有任何内容,则将m_nShellCommand
设置为CCommandLineInfo::FileNew
< / p>
答案 1 :(得分:0)
我用过
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
没有if语句。
答案 2 :(得分:0)
使用我的MFC应用程序,我想要类似的东西,但我发现接受的答案对我来说只是一个部分解决方案。如果在启动时在MFC应用程序的命令行上指定了文件名,则使用接受的答案将不会打开该文件。
我想(1)允许在从命令行调用MFC应用程序时打开文件,以及(2)更改当前工作文件夹。
在扩展InitInstance()
的应用程序的CWinAppEx
覆盖中,我使用了以下来源:
// determine the user's home folder for documents such as C:\user\xxx\Documents
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, 0, CMFCApplication4Doc::m_UserDocumentsFolder))) {
PathAppend(CMFCApplication4Doc::m_UserDocumentsFolder, L"GenPOS BO");
TRACE1("home path found %s\n", CMFCApplication4Doc::m_UserDocumentsFolder);
if (!CreateDirectory(CMFCApplication4Doc::m_UserDocumentsFolder, NULL)) {
DWORD dwLastError = GetLastError();
if (dwLastError != ERROR_ALREADY_EXISTS) {
// may be ERROR_PATH_NOT_FOUND indicating intermediate directories do not exist.
// CreateDirectory() will only create the final folder in the path so intermediate folders
// must already exist.
TRACE1("CreateDirectory error %d\n", dwLastError);
}
}
SetCurrentDirectory(CMFCApplication4Doc::m_UserDocumentsFolder);
}
else {
TRACE0("home path not found");
}
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew) // actually none
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
// Dispatch commands specified on the command line. Will return FALSE if
// app was launched with /RegServer, /Register, /Unregserver or /Unregister.
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The main window has been initialized, so show and update it
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();