如何阻止我的 MFC 应用程序在启动时调用 OnFileNew()?

Posted

技术标签:

【中文标题】如何阻止我的 MFC 应用程序在启动时调用 OnFileNew()?【英文标题】:How can I stop my MFC application from calling OnFileNew() when it starts? 【发布时间】:2008-10-09 14:41:31 【问题描述】:

我使用 Visual Studio 的应用程序向导创建了一个具有多文档界面的骨架 MFC 程序。当我启动这个程序时,它会自动创建一个子框架,我不希望它这样做 - 我需要主框架的客户区为空,直到用户选择打开一个文件。

调试器告诉我,当应用程序类的 InitInstance() 函数调用 ProcessShellCommand() 时,会创建一个 CChildFrame 对象,但什么是我重写此行为的好入口点?

【问题讨论】:

【参考方案1】:

这有效,它保持从外壳等打印/打开。

// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

if ( cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew )

    cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing ;


// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
    return FALSE;

【讨论】:

我认为这相当于 jeffm 的回答。它更长但更清晰,更接近我最终所做的。【参考方案2】:

这对我有用——改变

if (!ProcessShellCommand(cmdInfo))

if (cmdInfo.m_nShellCommand != CCommandLineInfo::FileNew && !ProcessShellCommand(cmdInfo))

在您应用的 InitInstance() 函数中。

【讨论】:

有效!但是完全跳过 ProcessShellCommand() 会产生不良后果吗?那个函数有什么作用? (我未能在我的项目中找到它的定义。) 我在 Visual Studio 文档中查找了它,看起来函数所做的只是处理参数,所以这很棒。再次感谢。 因为您只是跳过了“FileNew”命令,无论如何您都不想在启动时执行此命令,所以我认为这不会有问题。您仍在处理其他命令,因此我认为如果您传递文件名以在命令行上打开它,它仍然可以工作。 (但我没试过。)【参考方案3】:

在 InitInstance() 中跳过 ProcessShellCommand() 调用(在 FileNew 的情况下)确实是要走的路。

【讨论】:

【参考方案4】:

做一件事..

在您的 XXXApp.cpp 文件中

在这个方法中:-

评论以下行.. /*

    CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

// Dispatch commands specified on the command line.  Will return FALSE if
// app was launched with /RegServer, /Register, /Unregserver or /Unregister.
if (!ProcessShellCommand(cmdInfo))
    return; 

*/

像这样……

【讨论】:

以上是关于如何阻止我的 MFC 应用程序在启动时调用 OnFileNew()?的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC SDI 应用程序中调用 OnDraw

如何在Angular中启动应用程序时调用服务?

MFC:当没有选项卡存在时,如何绘制 CTabView 背景?

有没有办法覆盖当用户单击 CListCtrl 中的复选框时调用的处理程序? (MFC)

尝试在服务启动但应用程序崩溃时调用位置权限

如果我没有为它的相应命令声明消息映射条目,如何阻止 MFC 禁用我的控件?