プログラム終了時の処理(ダイアログ)
ダイアログベースのプログラムを終了させる場合、次の終了ステータスがある。
- IDOK
- "OK"ボタンを押した場合
- Enterキーを押した場合
- IDCANCEL
- "キャンセル"ボタンを押した場合
- Escキーを押した場合
- 「閉じる(C)」メニューを選択した場合
- Alt+F4キーを押した場合
- タイトルバー右端の「閉じる」ボタンを押した場合
OKになる終了の場合はCDialog::OnOK()が、キャンセルになる終了の場合はCDialog::OnCancel()が呼ばれる。
つまりダイアログ終了時に特別な操作を行う場合は、これらの関数をオーバーライドしてそこに記述する。
また、プログラムの終了時に必ず(OKでもキャンセルでも)行いたい操作がある場合は、
ダイアログクラスのデストラクタに記述するのが一般的である。
独自の終了方法を用意する場合は、CDialog::EndDialog関数を呼び出せばよい。
EndDialog(IDOK); // OK終了の場合
EndDialog(IDCANCEL); // キャンセル終了の場合
ちなみにCDialog::OnOK()やCDialog::OnCancel()はこの関数を呼び出すことで終了処理を実行している。
目次へ
プログラム終了時の処理(ドキュメントビュー形式)
ドキュメントビュー形式のプログラムの終了時に特別な処理を行う場合、次のような方法がある。
- ID_APP_EXITのメッセージハンドラを作成する
- [ファイル(F)] - [アプリケーションの終了(X)]のデフォルトのメニューIDはID_APP_EXITになっている。
ClassWizardを使ってこれに対するメッセージハンドラOnAppExitを作成すれば、
終了時にこのハンドラ関数が呼び出される。
- CWnd::OnDestroy()をオーバーライドする
- 上記の方法では、タイトルバー右端の「閉じる」ボタンを押した場合には処理が呼び出されない。
いかなる終了方法でも必ず実行したい処理がある場合には、CWnd::OnDestroy()をオーバーライドする。
- CWnd::OnClose()をオーバーライドする
- この関数でも終了処理を行うことができる。デフォルトではCWnd::DestroyWindow()を呼び出している。
CWinApp::ExitInstance()をオーバーライドする
アプリケーションクラスのこの関数をオーバーライドしてもよい。
また、独自に終了方法を用意するには、親ウィンドウに対しWM_CLOSEメッセージを送る。
void CMyView::OnButton1()
{
AfxGetMainWnd()->PostMessage(WM_CLOSE);
}
目次へ