ウィンドウを終了する直前の処理 – プログラミング – Home

ウィンドウを終了する直前の処理
 
通知
すべてクリア

[解決済] ウィンドウを終了する直前の処理


Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

何時もお世話になります。
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()はどのような目的で使うのかがもう一つ分かりません。

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


引用未解決
トピックタグ
Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

追加です。

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


返信引用
小悪魔恭子
 小悪魔恭子
(@小悪魔恭子)
ゲスト
結合: 22年前
投稿: 25
 

CMainFrameのOnClose()で

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

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


返信引用
小悪魔恭子
 小悪魔恭子
(@小悪魔恭子)
ゲスト
結合: 22年前
投稿: 25
 

>それからdeleteはnewしたオブジェクトのデストラクタで行うべきでは?
なんか変な日本語でした・・・

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

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

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

ということです。


返信引用
Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

小悪魔恭子 様、

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


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

メッセージボックスを表示する前に既に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
 Wanderer
(@Wanderer)
ゲスト
結合: 22年前
投稿: 35
 

> あと、①②③については未だ全く分かりません

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

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

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

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


返信引用
Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

tib様、
Wanderer様、

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


返信引用
Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

小悪魔恭子 様、

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

CMainFrameのOnClose()で

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

・・・かな?


返信引用
Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

Wanderer様も有難うございました。
今後とも宜しくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました