ウィンドウを終了する直前の処理

[戻る]
Beginner 2003/02/15(土) 06:42:02
何時もお世話になります。
Win2K + VC6++ + MFCです。

SDIで作成したプログラムのウィンドウ終了時に確保したオブジェクトの開放を行うべく以下の
プログラムを書きました。

void CBlockHitGameView::OnDestroy() 
{
    CView::OnDestroy();
    
    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
    int ret = AfxMessageBox("本当に終了しても良いですか?", MB_OKCANCEL);
    if (ret == IDOK) {
        delete[] *block;
        delete ball;
        delete racket;
    } else {
        // messageを空投げしてOnDestry()を実行させなくする
        // でも、その方法がわからない
    }
}

しかし、
@else文の部分でどのようにこのハンドラを実行させないようにするのかが分かりません。
A当初、OnDestroy()でなくOnClose()ハンドラで行おうとしたのですが、デバッグポイントを
OnClose()内にセットしても、ウィンドウクローズ時にOnClose()内に飛んでこないことが分か
りました。だとすればOnClose()はどのような目的で使うのかがもう一つ分かりません。

お忙しい所、どなたかご教授下さい。

Beginner 2003/02/15(土) 06:46:57
追加です。

この方法だと、AfxMessageBoxが表示される前に既にウィンドウは消されてしまっていることが
分かりました。
Bウィンドウが消される前にAfxMessageBoxが表示されるようにするにはどこのハンドラに記述
すれば良いでしょうか?

小悪魔恭子 2003/02/15(土) 07:08:51
CMainFrameのOnClose()で

void CMainFrame::OnClose() 
{
  // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理
を呼び出してください
  int ret = AfxMessageBox("本当に終了しても良いですか?", MB_OKCANCEL);
  if (ret == IDOK) {
    CFrameWnd::OnClose();
  } else {
    ; // do nothing
  }
}

・・・かな?
それからdeleteはnewしたオブジェクトのデストラクタで行うべきでは?
外してたらごめんなさい。

小悪魔恭子 2003/02/15(土) 07:26:59
>それからdeleteはnewしたオブジェクトのデストラクタで行うべきでは?
なんか変な日本語でした・・・

CXXX::CXXX()
{
  m_zzz = new CZZZ();
}

としたのであれば、同じCXXXのデストラクタで

CXXX::~CXXX()
{
  delete m_zzz;
}

ということです。

Beginner 2003/02/15(土) 09:04:54
小悪魔恭子 様、

ご指導ありがとうございます。
今まで頭の中ではデストラクタが何をすべきか分かったつもりでいたのですが、今回はじめて自
分のものとして分かりました。
仰る通りです。すぐに訂正しました。
あと、@ABについては未だ全く分かりません。

tib 2003/02/15(土) 09:32:05
メッセージボックスを表示する前に既にCView::OnDestroy()を呼んでしまっているんです
よね。
それをメッセージボックスでOKを押したときのみ呼ぶようにすればいいのでは?
void CBlockHitGameView::OnDestroy() 
{
    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
    int ret = AfxMessageBox("本当に終了しても良いですか?", MB_OKCANCEL);
    if (ret == IDOK) {
        delete[] *block;
        delete ball;
        delete racket;
        CView::OnDestroy();  ←ここに移動した。else節は削除。
    }
}

Wanderer 2003/02/15(土) 10:00:23
> あと、@ABについては未だ全く分かりません

SDI ならウインドウを閉じるときにまず CMainFrame::OnClose()
に来ます。

CFrameWnd::OnClose()内で、CFrameWnd::DestroyWindow()が呼ばれ、その子
ウインドウである Viewが一緒に破棄されますので、 CView::OnClose()は呼ば
れません。

ですから、小悪魔恭子さんのおっしゃるとおり、閉じるかどうかの確認は
CFrameWnd::OnClose()で行なうべきだと思います。

多分ですが、CView::OnDestroy()に来た時点では、既に破棄活動に入っていま
すから、基底クラスを呼ばなくてもウインドウは破棄されると思います。

Beginner 2003/02/15(土) 12:25:25
tib様、
Wanderer様、

ご指導有難うございます。
現在、毎週の如くの遠方への出張に来ていて、試みることが困難です。
確認次第、ご報告させて頂きます。

Beginner 2003/02/15(土) 14:16:57
[[解決]]
小悪魔恭子 様、

まさしくご指摘の通りでした。有難うございます。
今後ともご指導宜しくお願いします。

CMainFrameのOnClose()で

void CMainFrame::OnClose() 
{
  // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理
を呼び出してください
  int ret = AfxMessageBox("本当に終了しても良いですか?", MB_OKCANCEL);
  if (ret == IDOK) {
    CFrameWnd::OnClose();
  } else {
    ; // do nothing
  }
}

・・・かな?

Beginner 2003/02/15(土) 14:19:53
[[解決]]
Wanderer様も有難うございました。
今後とも宜しくお願いします。

古いスレッドには追加発言できません。