Каков правильный способ программного выхода из приложения MFC?
использование windows MFC c++. У меня есть стороннее приложение, которое вызывает пользовательский метод в моем производном классе CWinApp. Этот метод вызывается после InitInstance (). Если в этом методе есть ошибка, такая, что исключение выбрасывается и ловится в блоке try/catch, я хотел бы выйти из приложения из блока catch. Каков канонический и правильный способ бросить курить?
обновление:
Serge я считаю правильным, что в initinstance () возвращается false-это правильный способ выйти из приложения. Однако теперь предположим, что я хочу выйти из обработчика OnInitDialog() производного класса CDialog, каков правильный способ сделать это.
обновление 2
для меня я нашел вызов PostMessage (WM_CLOSE) лучшим способом из моего немодального производного класса CDialog. Все другие методы ухода, которые я пробовал, в некоторых случаях вызывали бы исключение.
вот пример того, как я использую это:
BOOL SomeDialog::OnInitDialog()
{
CDialog::OnInitDialog();
::OleInitialize(nullptr);
try
{
// ...load settings file here
}
catch(...)
{
PostMessage(WM_CLOSE);
return TRUE;
}
// return TRUE unless you set the focus to a control
return TRUE;
}
3 ответов
В InitInstance ()
выход из приложения, пока вы все еще в InitInstance()
: просто вернуть FALSE
С InitInstance()
.
в главном цикле обработки сообщений
это еще одна история, хотя, если вы уже находитесь в цикле сообщений: стандартный способ закрыть приложение, чтобы выйти из цикла сообщений:
PostQuitMessage(0)
, как следует из названия, сообщения a WM_QUIT
сообщение. Цикл сообщений реагирует, выходя из цикла и закрывая программа.
но вы не должны просто делать это: вы должны закрыть открытые окна в своем приложении. Если у вас есть только главное окно, вы должны уничтожить его, назвав
m_pMainWindow->DestroyWindow();
MFC будет реагировать PostQuitMessage()
для вас, следовательно, выйти из основного цикла сообщений и закрыть приложение.
еще лучше, вы должны опубликовать WM_CLOSE
позволить вашему главному окну закрыть грациозно. Например, он может принять решение сохранить текущий документ. Остерегайтесь, хотя: стандарт OnClose()
обработчик может предложить пользователю сохранить грязные документы. Пользователь может даже отменить действие закрытия с помощью этого приглашения (сохранить документ? Да, Нет, Отменить).
уничтожение главного окна опубликует WM_DESTROY
сообщение. MFC реагирует вызовом PostQuitMessage(0)
для выхода из насоса сообщений. (На самом деле, MFC делает вызов OnNcDestroy()
С WM_NCDESTROY
что является абсолютным последнее сообщение, полученное окне)
диалоговое приложение
вызов EndDialog(-1);
// или заменить -1 by IDCANCEL
, ни
этот вызов, как вы, вероятно, знаете, закроет диалог.
обратите внимание, что основной диалог диалогового приложения выполняется в InitInstance (). Закрытие диалога будет просто выйти InitInstance()
, которая всегда возвращает FALSE
в таких проектах.
просто использовать:
PostQuitMessage(0);
имейте в виду, что ваша программа не выйдет мгновенно из этого вызова, окно/программа получит сообщение WM_QUIT, а затем ваша программа выйдет.
Serge - ваш ответ, К сожалению, не лучший способ сделать это. PostQuitMessage(0) - это путь и MFC уничтожит окна для вас. Вы должны избегать вызова m_pmainwindow - >DestroyWindow() напрямую.