何時もお世話になります。
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文の部分でどのようにこのハンドラを実行させないようにするのかが分かりません。
②当初、OnDestroy()でなくOnClose()ハンドラで行おうとしたのですが、デバッグポイントを
OnClose()内にセットしても、ウィンドウクローズ時にOnClose()内に飛んでこないことが分か
りました。だとすればOnClose()はどのような目的で使うのかがもう一つ分かりません。
お忙しい所、どなたかご教授下さい。
追加です。
この方法だと、AfxMessageBoxが表示される前に既にウィンドウは消されてしまっていることが
分かりました。
③ウィンドウが消される前にAfxMessageBoxが表示されるようにするにはどこのハンドラに記述
すれば良いでしょうか?
CMainFrameのOnClose()で
void CMainFrame::OnClose()
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理
を呼び出してください
int ret = AfxMessageBox(本当に終了しても良いですか?, MB_OKCANCEL);
if (ret == IDOK) {
CFrameWnd::OnClose();
} else {
; // do nothing
}
}
・・・かな?
それからdeleteはnewしたオブジェクトのデストラクタで行うべきでは?
外してたらごめんなさい。
>それからdeleteはnewしたオブジェクトのデストラクタで行うべきでは?
なんか変な日本語でした・・・
CXXX::CXXX()
{
m_zzz = new CZZZ();
}
としたのであれば、同じCXXXのデストラクタで
CXXX::~CXXX()
{
delete m_zzz;
}
ということです。
小悪魔恭子 様、
ご指導ありがとうございます。
今まで頭の中ではデストラクタが何をすべきか分かったつもりでいたのですが、今回はじめて自
分のものとして分かりました。
仰る通りです。すぐに訂正しました。
あと、①②③については未だ全く分かりません。
メッセージボックスを表示する前に既にCView::OnDestroy()を呼んでしまっているんです
よね。
それをメッセージボックスでOKを押したときのみ呼ぶようにすればいいのでは?
void CBlockHitGameView::OnDestroy()
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
int ret = AfxMessageBox(本当に終了しても良いですか?, MB_OKCANCEL);
if (ret == IDOK) {
delete[] *block;
delete ball;
delete racket;
CView::OnDestroy(); ←ここに移動した。else節は削除。
}
}
> あと、①②③については未だ全く分かりません
SDI ならウインドウを閉じるときにまず CMainFrame::OnClose()
に来ます。
CFrameWnd::OnClose()内で、CFrameWnd::DestroyWindow()が呼ばれ、その子
ウインドウである Viewが一緒に破棄されますので、 CView::OnClose()は呼ば
れません。
ですから、小悪魔恭子さんのおっしゃるとおり、閉じるかどうかの確認は
CFrameWnd::OnClose()で行なうべきだと思います。
多分ですが、CView::OnDestroy()に来た時点では、既に破棄活動に入っていま
すから、基底クラスを呼ばなくてもウインドウは破棄されると思います。
tib様、
Wanderer様、
ご指導有難うございます。
現在、毎週の如くの遠方への出張に来ていて、試みることが困難です。
確認次第、ご報告させて頂きます。
小悪魔恭子 様、
まさしくご指摘の通りでした。有難うございます。
今後ともご指導宜しくお願いします。
CMainFrameのOnClose()で
void CMainFrame::OnClose()
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理
を呼び出してください
int ret = AfxMessageBox(本当に終了しても良いですか?, MB_OKCANCEL);
if (ret == IDOK) {
CFrameWnd::OnClose();
} else {
; // do nothing
}
}
・・・かな?
Wanderer様も有難うございました。
今後とも宜しくお願いします。