วิธีปิดการใช้งานการสร้างเอกสาร/มุมมองอัตโนมัติเมื่อแอปพลิเคชัน 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