Cara menonaktifkan pembuatan dokumen/tampilan otomatis saat aplikasi MFC pertama kali dimulai

Saya memiliki aplikasi MFC biasa yang menggunakan arsitektur Doc/View. Ketika aplikasi dimulai secara otomatis membuat tampilan dokumen kosong. Saya ingin menonaktifkan tampilan otomatis ini saat startup dan menampilkan tampilan hanya ketika pengguna mengklik "Dokumen Baru" dari menu File.

Apakah ada cara untuk melakukannya?

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 sumber


Jawaban (3)


Kode standar MFC (yang dibuat oleh wizard) mengasumsikan bahwa Anda selalu ingin melihat dokumen baru jika program dijalankan sendiri (dibandingkan dengan mengklik dua kali pada file data atau menjalankannya dengan opsi baris perintah untuk membuka file ); masukkan baris berikut sebelum panggilan ke ProcessShellCommand() untuk menonaktifkan "fitur" ini:

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

[jika Anda tertarik, Anda dapat menelusuri kode sumber MFC untuk ParseCommandLine() yang menyetel m_nShellCommand ke CCommandLineInfo::FileNew jika tidak ada apa pun di baris perintah]

person Edward Clements    schedule 07.07.2014

saya menggunakan

    cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

tanpa pernyataan if.

Lihat CCommandLineInfo::m_nShellCommand

person Elmar Klausmeier    schedule 24.01.2017

Dengan aplikasi MFC saya, saya menginginkan sesuatu yang serupa namun saya menemukan bahwa jawaban yang diterima hanyalah sebagian solusi bagi saya. Jika nama file ditentukan pada baris perintah aplikasi MFC saat dijalankan, menggunakan jawaban yang diterima tidak akan membuka file.

Saya ingin (1) mengizinkan file dibuka ketika aplikasi MFC dipanggil dari baris perintah dan (2) mengubah folder kerja saat ini.

Dalam InitInstance() override aplikasi yang memperluas CWinAppEx saya menggunakan sumber berikut:

// 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