×ボタンを押しても、ウィンドウが消えないようにするには?(ダーティ処理をさせるには)

[戻る]
aw11 [E-Mail] 2001/11/11(日) 16:25:23
はじめて質問させていただきます。

ウィンドウの×ボタンを押した時、画面が普通に消えてしまいますよね。
それは良いんですが、ダーティ処理(wordなどで良くある「文章が変更されていますが…」ってやつ)
をしたいときに、OnDestroy関数にプログラムを追加しても画面が消えてしまいます。

「文章を変更してあるので終了したくない!」って時に、メッセージボックスで「いいえ」
を選択しても、画面がすでに消えているので作業に戻ることができません。

わかりにくいな。

つまり私がやりたいのは、プログラム終了処理で、

エディットボックス等の内容を変更→×ボタンを押す→メッセージボックスを表示
→「終了をしない」を選択→また作業の続行

っていう処理がしたいのです。
今の段階だと、メッセージボックスの表示前にウィンドウ自体が画面から消えます。

ダーティ処理の方法などはわかっていますので、
×ボタンを押した時、どういうメッセージがプログラムに渡されて、
どのような関数が終了時に使われるのか、教えて頂けるとありがたいです。
よろしくお願いします。

ちなみにスケルトン構成は
作成するアプリケーションの種類→SDI
基本クラス→CFormView
です。

am 2001/11/11(日) 17:00:01
WM_DESTROY でなく、WM_CLOSE( OnClose イベント )でやればいいのでは?

aw11 2001/11/11(日) 17:25:07
ありがとうございます。
それは私もやってみたのですが、出来ないんです。
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);
}

あー、わかんねぇ。

CdS 2001/11/11(日) 17:35:55
CMainFrame::OnCloseでやってみればどうでしょう。

kazuma 2001/11/11(日) 17:54:10
MFC 的には、
CDocument::SetModifiedFlag を使ってダーティであることを示すほうがいいでしょう。
もしくは CDocument::CanCloseFrame をオーバーライドするか。

kazuma 2001/11/11(日) 17:59:30
> もしくは CDocument::CanCloseFrame をオーバーライドするか。
SaveModified のほうがよさそうですね。

SetModifiedFlag を使えば自分でメッセージを出す必要もないです。

aw11 2001/11/12(月) 15:43:31
CdSさん、kazumaさん、ありがとうございます。

でも、問題は残ってしまいました。

まずMainFrameにOnclose関数を追加して、処理を書いてみると、
実行は出来ても×ボタンを押すと強制終了されてしまいます。
私のプログラム的な問題なのかよく分からんので、
なんとも言えません。

SetModifiedFlagを使うと、一応成功します。
しかし、ファイルを開く、上書き保存、名前をつけて保存の部分を、
自分ですべてプログラムを書いているためか(しかもビューに)、
ファイル名が参照されないです(いつまでたっても「無題が変更…」のまま)。
シリアライズ関数を使ってないから、
ドキュメントの方とうまく関連付けられていないみたいです。

それにしても「ダーティ処理」について触れてる本ってすくないっすね。
書いてあっても「こうしたい!」って要望に答えてくれないし。
自分で頑張れってことか。
なんか良い本知ってる人いないですかね。

Bun 2001/11/12(月) 16:19:25
>まずMainFrameにOnclose関数を追加して、処理を書いてみると、
>実行は出来ても×ボタンを押すと強制終了されてしまいます。

CMainFrame::OnClose()のソースをのせてみては?

>AfxGetMainWnd()->SendMessage(WM_CLOSE);

WM_CLOSEはPostMessage()したほうが良いと思います。

aw11 2001/11/13(火) 13:31:01
[[解決]]
皆さんありがとうございました。
何とかなるようになりました。

それでも、かなり方向転換をして、
Serializeを使ってファイルを読み取るようにして、
SetModifiedFlagをエディットボックスに文字が入力されたら、
起動してTRUEにしたら、うまく行きました。

それでもちょっと問題は残って…また新しく書きますけど。

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