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

×ボタンを押しても、ウィンドウが消えな...
 
通知
すべてクリア

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


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

はじめて質問させていただきます。

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

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

わかりにくいな。

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

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

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

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

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


引用未解決
トピックタグ
am
 am
(@am)
ゲスト
結合: 24年前
投稿: 13
 

WM_DESTROY でなく、WM_CLOSE( OnClose イベント )でやればいいのでは?


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

ありがとうございます。
それは私もやってみたのですが、出来ないんです。
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
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

CMainFrame::OnCloseでやってみればどうでしょう。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

MFC 的には、
CDocument::SetModifiedFlag を使ってダーティであることを示すほうがいいでしょう。
もしくは CDocument::CanCloseFrame をオーバーライドするか。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

> もしくは CDocument::CanCloseFrame をオーバーライドするか。
SaveModified のほうがよさそうですね。

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


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

CdSさん、kazumaさん、ありがとうございます。

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

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

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

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


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

>まずMainFrameにOnclose関数を追加して、処理を書いてみると、
>実行は出来ても×ボタンを押すと強制終了されてしまいます。

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

>AfxGetMainWnd()->SendMessage(WM_CLOSE);

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


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

皆さんありがとうございました。
何とかなるようになりました。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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