如何在MFC应用程序首次启动时禁用自动文档/视图创建

时间:2014-07-07 11:51:08

标签: c++ visual-c++ mfc

我有一个使用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;

3 个答案:

答案 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语句。

请参阅CCommandLineInfo::m_nShellCommand

答案 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();