はじめて質問させていただきます。
ウィンドウの×ボタンを押した時、画面が普通に消えてしまいますよね。
それは良いんですが、ダーティ処理(wordなどで良くある「文章が変更されていますが…」ってやつ)
をしたいときに、OnDestroy関数にプログラムを追加しても画面が消えてしまいます。
「文章を変更してあるので終了したくない!」って時に、メッセージボックスで「いいえ」
を選択しても、画面がすでに消えているので作業に戻ることができません。
わかりにくいな。
つまり私がやりたいのは、プログラム終了処理で、
エディットボックス等の内容を変更→×ボタンを押す→メッセージボックスを表示
→「終了をしない」を選択→また作業の続行
っていう処理がしたいのです。
今の段階だと、メッセージボックスの表示前にウィンドウ自体が画面から消えます。
ダーティ処理の方法などはわかっていますので、
×ボタンを押した時、どういうメッセージがプログラムに渡されて、
どのような関数が終了時に使われるのか、教えて頂けるとありがたいです。
よろしくお願いします。
ちなみにスケルトン構成は
作成するアプリケーションの種類→SDI
基本クラス→CFormView
です。
WM_DESTROY でなく、WM_CLOSE( OnClose イベント )でやればいいのでは?
ありがとうございます。
それは私もやってみたのですが、出来ないんです。
OnClose関数作って、こんな感じでプログラムを書いたんですけど、
void CPlay3View::OnClose()
{
// TODO: この位置にメッセージ ハンドラ用のコード
を追加するかまたはデフォルトの処理を呼び出してください
int ret;
CString msg;
if(m_ed1.GetModify()){
msg=テキストが修正されています。このまま終了しますか?;
ret=AfxMessageBox(msg,MB_YESNO|MB_ICONQUESTION);
if(ret==IDNO) return;
}
CFormView::OnClose();
}
反応なしです。
ビュークラスでも関係ないだろうし…。
ちなみにメニューから「ファイル」→「終了」では、
ID_APP_EXIT、OnAppExit関数を使って次のようにプログラムを書くと出来るのですが…
void CPlay3View::OnAppExit()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
int ret;
CString msg;
if(m_ed1.GetModify()){
msg=テキストが修正されています。このまま終了しますか?;
ret=AfxMessageBox(msg,MB_YESNO|MB_ICONQUESTION);
if(ret==IDNO) return;
}
AfxGetMainWnd()->SendMessage(WM_CLOSE);
}
あー、わかんねぇ。
CMainFrame::OnCloseでやってみればどうでしょう。
MFC 的には、
CDocument::SetModifiedFlag を使ってダーティであることを示すほうがいいでしょう。
もしくは CDocument::CanCloseFrame をオーバーライドするか。
> もしくは CDocument::CanCloseFrame をオーバーライドするか。
SaveModified のほうがよさそうですね。
SetModifiedFlag を使えば自分でメッセージを出す必要もないです。
CdSさん、kazumaさん、ありがとうございます。
でも、問題は残ってしまいました。
まずMainFrameにOnclose関数を追加して、処理を書いてみると、
実行は出来ても×ボタンを押すと強制終了されてしまいます。
私のプログラム的な問題なのかよく分からんので、
なんとも言えません。
SetModifiedFlagを使うと、一応成功します。
しかし、ファイルを開く、上書き保存、名前をつけて保存の部分を、
自分ですべてプログラムを書いているためか(しかもビューに)、
ファイル名が参照されないです(いつまでたっても「無題が変更…」のまま)。
シリアライズ関数を使ってないから、
ドキュメントの方とうまく関連付けられていないみたいです。
それにしても「ダーティ処理」について触れてる本ってすくないっすね。
書いてあっても「こうしたい!」って要望に答えてくれないし。
自分で頑張れってことか。
なんか良い本知ってる人いないですかね。
>まずMainFrameにOnclose関数を追加して、処理を書いてみると、
>実行は出来ても×ボタンを押すと強制終了されてしまいます。
CMainFrame::OnClose()のソースをのせてみては?
>AfxGetMainWnd()->SendMessage(WM_CLOSE);
WM_CLOSEはPostMessage()したほうが良いと思います。
皆さんありがとうございました。
何とかなるようになりました。
それでも、かなり方向転換をして、
Serializeを使ってファイルを読み取るようにして、
SetModifiedFlagをエディットボックスに文字が入力されたら、
起動してTRUEにしたら、うまく行きました。
それでもちょっと問題は残って…また新しく書きますけど。