Я использовал мастер приложений Visual Studio для создания скелета программы MFC с многодокументным интерфейсом. Когда я запускаю эту программу, она автоматически создает дочерний фрейм, чего я не хочу делать - мне нужно, чтобы клиентская область основного фрейма была пустой, пока пользователь не решит открыть файл.
Отладчик сообщает мне, что объект CChildFrame создается, когда функция класса приложения InitInstance () вызывает ProcessShellCommand (), но что является хорошей точкой входа для меня, чтобы переопределить это поведение?
Это сработало для меня - измените
if (!ProcessShellCommand(cmdInfo))
к
if (cmdInfo.m_nShellCommand != CCommandLineInfo::FileNew && !ProcessShellCommand(cmdInfo))
в функции InitInstance () вашего приложения.
Я просмотрел его в документации Visual Studio, и похоже, что все, что функция делает, - это обрабатывает параметр, так что это здорово. Еще раз спасибо.
Поскольку вы пропускаете только команду «FileNew», которую вы в любом случае не хотите выполнять при запуске, я не думаю, что это будет проблемой. Вы все еще обрабатываете другие команды, поэтому я думаю, что они все равно будут работать, если, например, вы передадите имя файла для открытия в командной строке. (Но я не пробовал.)
Пропуск вызова ProcessShellCommand () (в случае FileNew) в InitInstance () действительно правильный путь.
Это работает, поддерживает печать / открытие из оболочки и т. д.
// 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;
Я думаю, это эквивалентно ответу Джеффма. Он длиннее, но яснее и ближе к тому, чем я закончил.
Сделай одно ...
в вашем файле 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;
* /
нравится....
Оно работает! Но будет ли вообще пропуск ProcessShellCommand () иметь нежелательные последствия? Что делает эта функция? (Я не нашел его определения в своем проекте.)