web-dev-qa-db-ja.com

プログラムでMFCアプリケーションを終了する正しい方法は何ですか?

Windows MFC C++の使用。 CWinApp派生クラスのユーザー定義メソッドを呼び出すサードパーティのアプリがあります。このメソッドは、InitInstance()の後に呼び出されます。このメソッドにエラーがあり、例外がスローされてtry/catchブロックでキャッチされる場合は、catchブロックからアプリケーションを終了したいと思います。終了するための標準的で正しい方法は何ですか?

更新:

サージ私は、InitInstance()でfalseを返すことが、アプリケーションを終了する正しい方法であると信じています。ただし、CDialog派生クラスのOnInitDialog()ハンドラーを終了したいとします。これを行う正しい方法は何ですか。

更新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;
}
19
User

InitInstance()

InitInstance()でアプリを終了する:InitInstance()からFALSEを返すだけです。

メインメッセージループ内

ただし、すでにメッセージループに入っている場合は、別の話になります。アプリを閉じる標準的な方法は、メッセージループを終了することです。

PostQuitMessage(0)は、その名前が示すように、_WM_QUIT_メッセージを投稿します。メッセージループは、ループを終了してプログラムを閉じることで反応します。

ただし、単純にそれを行うべきではありません。アプリで開いているウィンドウを閉じる必要があります。メインウィンドウしかない場合は、電話して破棄する必要があります

_m_pMainWindow->DestroyWindow();
_

MFCはPostQuitMessage()によって反応するため、メインメッセージループを終了してアプリを閉じます。

さらに良いことに、メインウィンドウを正常に閉じるには、_WM_CLOSE_を投稿する必要があります。たとえば、現在のドキュメントを保存する場合があります。ただし、注意してください。標準のOnClose()ハンドラーは、ユーザーにダーティドキュメントの保存を求める場合があります。ユーザーは、このプロンプトを使用してクローズアクションをキャンセルすることもできます(ドキュメントを保存しますか?はい、いいえ、キャンセルします)。

メインウィンドウを破棄すると、_WM_DESTROY_メッセージが送信されます。 MFCは、PostQuitMessage(0)を呼び出してメッセージポンプを終了することで反応します。 (実際には、MFCはOnNcDestroy()で呼び出しを行います。これは、ウィンドウが受信した絶対的な最後のメッセージである_WM_NCDESTROY_であるためです)

ダイアログベースのアプリ

EndDialog(-1); //を呼び出すか、-1をIDCANCELに置き換えます。

この呼び出しは、ご存じのとおり、ダイアログを閉じます。

ダイアログベースのアプリのメインダイアログはInitInstance()で実行されることに注意してください。ダイアログを閉じると、InitInstance()が終了し、そのようなプロジェクトでは常にFALSEが返されます。

28
Serge Wautier

単に使用:

PostQuitMessage(0);

プログラムがこの呼び出しからすぐに終了するわけではないことに注意してください。ウィンドウ/プログラムはWM_QUITメッセージを受信して​​から、プログラムを終了します。

9
leetNightshade

サージ-あなたの答えは残念ながらそれを行うための最良の方法ではありません。 PostQuitMessage(0)は行く方法であり、MFCはあなたのためにウィンドウを破壊します。 m_pMainWindow-> DestroyWindow()を直接呼び出さないでください。

2
zar