Как отключить автоматическое создание документов / представлений при первом запуске приложения MFC

У меня есть обычное приложение MFC, использующее архитектуру Doc / View. Когда приложение запускается, оно автоматически создает представление пустого документа. Я хочу отключить это автоматическое представление при запуске и отображать представление только тогда, когда пользователь нажимает «Новый документ» в меню «Файл».

Есть ли способ сделать это?

CMultiDocTemplate* template = new CMultiDocTemplate(IDR_DorlionTYPE,
        RUNTIME_CLASS(CDocument),
        RUNTIME_CLASS(CChildFrame), // custom MDI child frame
        RUNTIME_CLASS(CView));
    if (!CView)
        return FALSE;

person Yamen Ajjour    schedule 07.07.2014    source источник


Ответы (3)


Стандартный код MFC (созданный мастером) предполагает, что вы всегда хотите видеть новый документ, если программа запускается сама по себе (в отличие от двойного щелчка по файлу данных или его запуска с параметром командной строки, чтобы открыть файл. ); вставьте следующие строки перед вызовом ProcessShellCommand(), чтобы отключить эту "функцию":

if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)   // actually none
    cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

[если вам интересно, вы можете просмотреть исходный код MFC для ParseCommandLine(), где он устанавливает m_nShellCommand в CCommandLineInfo::FileNew, если в командной строке ничего нет]

person Edward Clements    schedule 07.07.2014

я использовал

    cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

без оператора if.

См. CCommandLineInfo :: m_nShellCommand

person Elmar Klausmeier    schedule 24.01.2017

В моем приложении 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();
person Richard Chambers    schedule 18.02.2017