プログラムの終了を確認する



CG系のソフトに「終了確認」をするアプリケーションが良くありますが、ビジネス系のアプリケーションでも「終了確認」は必須です。
メニューからプログラムの終了が選択されたとき、終了確認の MessageBox を表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクト(Menu)を作成して下さい。
  2. プロジェクトが作成できたら Menu のリソース定義を確認します。
    リソースビューのメインフォルダーから Menu を選択して下さい。
    [Menu] から [IDC_MAIN] をダブルクリックするとメニューが表示されます。
    メニューの画像
  3. メニュー画面を表示して、[アプリケーションの終了(X)]をダブルクリックするとメニューアイテムプロパティが表示されます。
    IDに IDM_EXIT が、Caption に アプリケーションの終了(&X) が設定されていることを確認して下さい。
    今回は確認だけで、メニューの設定は行いません。
    メニューのプロパティ
  4. メニューからアプリケーションの終了(X) が選択されると CALLBACK WndProc() 関数の IDM_EXIT に制御が渡されます。
    ここにプログラムの終了を確認するコードを記述します。
  5. 終了確認の MessageBox を表示するコードです。
    ページ先頭の画面が表示されて[OK]または[キャンセル]を選択します。
        case IDM_EXIT:
            int id;
            id= MessageBox(hWnd,(LPCSTR)"終了しますか",
                           (LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION);
            if (id==IDOK)  DestroyWindow(hWnd);
            break;
        
  6. [ビルド]から[実行]を選択して下さい。
    ビルド(コンパイル)に続いて、エラーが無ければプログラムが実行されます。
    メニューからアプリケーションの終了(X) を選択すると終了確認の MessageBox が表示されます。
  7. タイトルバーの「X」をクリックして終了したとき MessageBox は表示されるでしょうか。

【演習】

このプログラムでは、メニューから終了が選択されたときは「終了確認の MessageBox」が表示されますが、 タイトルバーの「X」をクリックしたときは直ちに終了してしまいます。
「X」をクリックしたときにも、終了確認の MessageBox が表示されるようにプログラムして下さい。

メニューから[アプリケーションの終了]が選択されると [IDM_EXIT:] に制御が渡されます。
それに対して、タイトルバーの「X」をクリックしたときは [WM_CLOSE:] が呼ばれるのです。
ところが WM_CLOSE: が記述されていないので自動的に WM_DESTROY: が呼ばれてプログラムが終了してしまいます。
そこで WM_CLOSE: を記述して、ここで終了確認を行います。
  1. IDM_EXIT: で DestroyWindow(hWnd) を実行しないで WM_CLOSE をポストする PostMessage(hWnd,WM_CLOSE,0,0); を実行します。
    DestroyWindow(hWnd) は Windows を破棄する命令です。
        case IDM_EXIT:
            PostMessage(hWnd,WM_CLOSE,0,0);
            break;
        
  2. WM_CLOSE がポストされると WndProc() の WM_CLOSE: に制御が渡されます。
    タイトルバーの「X」をクリックしたときにも WM_CLOSE: が発生するので、ここで終了確認を行います。
        case WM_CLOSE:
               :
            MessageBox() で終了確認を行います。
               :
            break;
        
  3. DestroyWindow(hWnd) が実行されると WM_DESTROY: に制御が渡されます。
    PostQuitMessage( 0 ) で直ちにプログラムを終了させます。
        case WM_DESTROY:
            PostQuitMessage( 0 );
            break;
        

超初心者のプログラム入門(Win32API C++)